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