Java: устранение путаницы в причинах сброса соединения - PullRequest
2 голосов
/ 22 апреля 2010

Кажется, что в ответах на различные вопросы SO есть некоторая путаница и противоречивые утверждения: В чем причина моего java.net.SocketException: сброс соединения? . Здесь вы видите, что принятый ответ гласит, что соединение было закрыто другой стороной. Но это не так, закрытие соединения не вызывает сброса соединения. Это вызвано «основной ошибкой TCP / IP».

То, что я хочу знать, это то, действительно ли SocketException: Connection reset означает «непостоянную ошибку TCP / IP». Что на самом деле вызывает это? Я сомневаюсь, что это имеет какое-либо отношение к закрытому соединению (поскольку закрытие соединения не является флагом, достойным исключения, и чтение из закрытого соединения есть, но это не «основная ошибка TCP / IP».

Моя гипотеза такова

Сброс соединения вызван тем, что сервер не смог подтвердить ACK-пакет (полностью или просто неправильно согласно TCP / IP). И что SocketTimeoutException генерируется только тогда, когда data не генерируется, чтобы быть read (так как это выбрасывается во время чтения после определенной продолжительности, и чтение ожидает данные, но не касается пакетов ACK). Другими словами, read () генерирует исключение SocketTimeoutException, если оно не прочитало ни одного байта фактических данных (СЛОЙ ДАННЫХ) за отведенное время.

Ответы [ 2 ]

2 голосов
/ 23 апреля 2010

Из исходных текстов openjdk6 выясняется, что «Сброс подключения» выдается, когда попытка чтения данных завершается с ошибкой ECONNRESET (Linux & Solaris) или WSAECONNRESET (Windows).

По моему опыту, типичная причина заключается в том, что сторона на другом конце розетки закрыла розетку без предварительного отключения.

1 голос
/ 22 апреля 2010

По моему опыту, это происходит, когда клиент прерывает запрос (пользователь закрыл вкладку или щелкнул другую ссылку).

...