Кажется, есть некоторая путаница, а также противоречащие заявления о различных ответах SO: Что вызывая мой java.net.SocketException: сброс подключения?. Здесь вы можете видеть, что в принятом ответе указано, что соединение было закрыто другой стороной. Но это неправда, закрытие соединения не вызывает сброса соединения. Это вызвано «основной ошибкой TCP / IP».
Я хочу знать, действительно ли SocketException: Connection reset
означает помимо «неподтвержденной ошибки TCP / IP». Что на самом деле вызывает это? Насколько я сомневаюсь, это имеет какое-либо отношение к закрытию соединения (поскольку закрытие соединения не является флагом исключения, а чтение из закрытого соединения является, но это не «основная ошибка TCP / IP».
Моя гипотеза такова
Сброс соединения вызван отказом сервера подтвердить пакет ACK (полностью или просто неправильно в соответствии с TCP / IP). И что SocketTimeoutException генерируется только тогда, когда не генерируются данные для чтения (поскольку оно генерируется во время чтения по истечении определенного времени, а чтение ожидает данных, но не имеет отношения к пакетам ACK). Другими словами, read () выбрасывает SocketTimeoutException, если он не прочитал ни одного байта фактических данных (СЛОЙ ДАННЫХ) за отведенное время.
SO_LINGER
перед закрытием. - person user207421   schedule 23.03.2021