Если вы не приобрели некоторый навык в понимании проблем многопоточности и синхронизации, избегайте NIO. Это хорошая вещь, но вы (в настоящее время) недостаточно подготовлены для ее отладки, тем более не в полной мере понимаете и понимаете необходимость ее синхронизации.
Напишите класс Runnable, который оборачивает ServerSocket в цикл while, позволяя циклу блокироваться в методе accept
. Затем возьмите этот сокет возврата и создайте поток «обработчик клиента», который будет обрабатывать любые данные, поступившие в NIC.
Этот ресурс даст вам несколько советов по написанию этого более старого, немного более медленного и гораздо более понятного цикла прослушивания сервера. Я ссылался на «среднюю» страницу в статье, так как это листинг кода, но вы можете прочитать всю статью.
При этом используется более старая модель сетевой обработки «один поток для обработки запроса». Это не так уж плохо, но может возникнуть проблема с масштабируемостью.
Альтернатива - совершить глубокое погружение и сделать это с неблокирующим NIO. Это не очень сложно, но для этого нужно, чтобы вы полностью структурировали свой серверный код не так просто. По сути, вы получаете «пулы» рабочих потоков, которые могут выполнять различные задачи, а затем синхронизируете их при передаче данных от рабочего к работнику.