Я вижу другой только что опубликованный ответ, но я думаю, что вы взаимодействуете с клиентами, играющими в вашу игру, поэтому я могу предложить другой подход (в то время как BufferedReader определенно действителен в некоторых случаях).
Если бы вы хотели ... вы могли бы делегировать ответственность за "регистрацию" клиенту. Т.е. у вас будет набор подключенных пользователей с отметкой времени на последнем сообщении, полученном от каждого ... если время ожидания клиента истечет, вы принудительно перерегистрируете клиента, но это приводит к приведенной ниже цитате и идее.
Я прочитал это, чтобы фактически определить, закрыт ли сокет, данные должны быть записаны в выходной поток и должно быть обнаружено исключение. Это кажется действительно нечистым способом справиться с этой ситуацией.
Если ваш Java-код не закрыл / не отключил Socket, то как еще вы узнали бы, что удаленный хост закрыл ваше соединение? В конечном счете, ваш try / catch делает примерно то же самое, что и опросчик, ожидающий событий в сокете ACTUAL. Обратите внимание на следующее:
- ваша локальная система может закрыть ваш сокет без уведомления вас ... это просто реализация Socket (то есть он не опрашивает оборудование / драйвер / прошивку / что-либо для изменения состояния).
- новый Socket (Proxy p) ... есть несколько сторон (на самом деле 6 конечных точек), которые могут закрыть вам соединение ...
Я думаю, что одна из особенностей абстрактных языков заключается в том, что вы абстрагированы от мелочей. Подумайте о ключевом слове using в C # (try / finally) для SqlConnection s или чего-то еще ... это просто затраты на ведение бизнеса ... Я думаю, что try / catch / finally является принятым и необходимым шаблоном для использования Socket.