Если вам нужно выполнить сетевой ввод / вывод с чистым Java, у вас есть три варианта: старый ввод / вывод, новый ввод / вывод (nio) и новый ввод / вывод 2 (nio2). Старый ввод / вывод использует блокирующие вызовы, поэтому в основном вам понадобится один поток на соединение. Вы не хотите этого делать, поэтому вы должны использовать nio или nio2. На самом деле нет никаких ограничений на использование селектора только с сервером, вы можете использовать его для клиентских подключений.
Также обратите внимание, что использование nio или nio2 не самая простая задача в мире. Подумайте об использовании библиотеки netty
, которая была создана именно для вашего варианта использования: для написания масштабируемых сетевых приложений. Это не самая простая библиотека для использования, но я все же рекомендую ее, потому что она реализует много вещей для вас. Также есть много реализаций протоколов для netty, так что есть вероятность, что вам даже не нужно будет писать столько кода.
Большинство сетевых примеров действительно о серверах, потому что именно это обычно пишут люди. Но вполне возможно писать неблокирующие сетевые клиенты таким же образом.