На основании некоторых тестов, которые я провел, даже если вы не используете PrintWriter и вместо этого пишете напрямую в socket.getOutputStream (), я не думаю, что вам гарантировано исключение, когда сервер закрывает свой сокет, но еслиВы вызываете write () достаточно раз, и кажется, что в конечном итоге вы получите исключение.
Обратите внимание, что иногда существует различие в поведении в зависимости от того, находятся ли клиент и сервер на одном компьютере или нет.При локальном запуске, по-видимому, требуется меньше операций записи, прежде чем произойдет исключение «SocketException: Broken pipe».
Если вы хотите реально обнаружить, что сокет закрыт, вам нужно прочитайте из него и проверьте, возвращает ли чтение -1.(и, конечно, обрабатывать любые исключения)
Например:
if (socket.getInputStream().read(bytearray) < 0)
break;
Если сервер ничего не отправляет, вы можете взломать его, вызвав socket.setSoTimeout (1),и обработку / игнорирование SocketTimeoutException, но «правильный» способ сделать это, вероятно, начать с SocketChannel вместо Socket, чтобы вы могли использовать Selector , который должен уведомлять вас при чтении() метод может быть вызван.
btw, строка serverSocket.close () немного вводит в заблуждение и, вероятно, должна быть client.close ().Однако сразу после этого класс завершается, поэтому все сокеты все равно будут закрыты.