Часть документации, на которую вы ссылаетесь, относится к потокам на этом компьютере, а не к удаленным.Если у вас есть поток read () для сокета X, а поток B того же процесса закрывает сокет X, тогда будет вызвано исключение для вызова чтения потока A.
Когда сокет закрыт ()На локальном компьютере удаленный компьютер может определить, что через сокет больше не будет поступать данных, поэтому он возвращает -1 (см. документацию read () для InputStream).Это то, что происходит, когда вы явно закрываете соединение на клиенте.Сервер знает, что больше данных не будет, поэтому read () с радостью возвращает -1.Нет никаких исключительных обстоятельств.
Я предполагаю, что когда вы позволяете клиенту завершить работу без вызова close () на сокете, JVM или ОС отправляет TCP RST вместо правильного закрытия соединения (отправка TCPПЛАВНИК).Это приводит к тому, что вызов read () на сервере вызывает исключение.