Java net socketexception connection reset что делать

Ошибка java.net.SocketException: Conection reset — как исправить

В этом примере мы поговорим о java.net.SocketException. Это подкласс IOException, поэтому это проверенное исключение, которое сигнализирует о проблеме при попытке открыть или получить доступ к сокету.

Настоятельно рекомендуется использовать самый «определенный» класс исключений сокетов, который более точно определяет проблему. Стоит также отметить, что SocketException, выдаётся на экран с сообщением об ошибке, которое очень информативно описывает ситуацию, вызвавшую исключение.

Простое клиент-серверное приложение

Чтобы продемонстрировать это исключение, я собираюсь позаимствовать некоторый код из клиент-серверного приложения, которое есть в java.net.ConnectException. Он состоит из 2 потоков.

  • Поток 1 — SimpleServer, открывает сокет на локальном компьютере через порт 3333. Потом он ожидает установления соединения. Если происходит соединение, он создает входной поток и считывает 1 текстовую строчку, от клиента, который был подключен.
  • Поток номер 2 — SimpleClient, подключается к сокету сервера, открытого SimpleServer. Он отправляет одну текстовую строчку.

Получается, что 2 потока будут в разных классах, запущенных двумя разными основными методами, чтобы вызвать исключение:

Как вы можете видеть, я поместил в SimpleClient 15-секундную задержку, прежде чем попытаться отправить свое сообщение. К тому моменту, когда клиент вызывает sleep(), он уже создал соединение с сервером. Я собираюсь запустить оба потока, и после того, как клиент установит соединение, я внезапно остановлю клиентское приложение.
Вот что происходит на стороне сервера:

Мы получаем исключение SocketException с сообщением «Сброс подключения». Это происходит, когда один из участников принудительно закрывает соединение без использования close().

Конечно, вы можете сделать оперативное закрытие соединения, не закрывая приложение вручную. В коде клиента, после ожидания в течение 15 секунд (или меньше), вы можете выдать новое исключение (используя throws new Exception ()), но вы должны удалить finally, иначе соединение будет нормально закрываться, и SocketException не будет сброшен.

Как решить проблему с SocketException

SocketException — это общее исключение, обозначающее проблему при попытке доступа или открытия Socket. Решение этой проблемы должно быть сделано с особой тщательностью. Вы должны всегда регистрировать сообщение об ошибке, которое сопровождает исключение.

В предыдущем примере мы видели код сообщения. Это происходит, когда один из участников принудительно закрывает соединение без использования close (). Это означает, что вы должны проверить, был ли один из участников неожиданно прерван.

Также может быть сообщение «Слишком много открытых файлов», особенно если вы работаете в Linux. Это сообщение обозначает, что многие файловые дескрипторы открыты для системы. Вы можете избежать этой ошибки, если перейдете в /etc/sysctl.conf и увеличите число в поле fs.file-max. Или попытаться выделить больше стековой памяти.

Конечно, можно встретить много других сообщений. Например, «Ошибка привязки», где ваше соединение не может быть установлено, поскольку порт не может быть привязан к сокету. В этом случае проверьте, используется ли порт и т. д.
Если у вас проблема с minecraft, то в видео ниже очень просто объясняется как это решить.

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

java.net.SocketException: Connection reset

This SocketException occurs on the server side when the client closed the socket connection before the response could be returned over the socket. For example, by quitting the browser before the reponse was retrieved.

Connection reset simply means that a TCP RST was received. TCP RST packet is that the remote side telling you the connection on which the previous TCP packet is sent is not recognized, maybe the connection has closed, maybe the port is not open, and something like these. A reset packet is simply one with no payload and with the RST bit set in the TCP header flags.

The following are possible causes for the error:

  1. More commonly, it is caused by writing to a connection that the other end has already closed normally. In other words an application protocol error.

A Reset (RST) packet is received from a remote machine and interrupts the established connection. The sent RST packets may indicate that the TCP packets sent are not recognized, a connection between the local and remote machine is broken, or a particular port is closed and is not allowing for communication.

The TCP (Transmission Control Protocol) socket is closed because the socket received a close command from a remote machine.

The other end has deliberately reset the connection. It is rarely happens, and generally incorrect, for application software to do this, but it is not unknown for commercial software.

In Windows, ‘software caused connection abort’, which is not the same as ‘connection reset’, is caused by network problems sending from your end.

It can also be caused by closing a socket when there is unread data in the socket receive buffer.

In some cases, an intervening firewall or even the remote host itself might «forget» about your TCP connection. This could happen if you don’t send any data for a long time (120 minutes is a common time-out), or because the peer was rebooted and lost its information about active connections. Sending data on one of these defunct connections will cause a RST too.

  • Sometimes this can also be due to heavy load causing Server to queue the message and before it can read the message is got timed out at the client end. So you can also check server health and log for excessive load causing this error.
  • Читать еще:  Технология экрана VA что это

    SocketException

    SocketException is a subclass of IOException so it’s a checked exception. It is the most general exception that signals a problem when trying to open or access a socket. The full exception hierarchy of this error is:

    As you might already know, it’s strongly advised to use the most specific socket exception class that designates the problem more accurately. It is also worth noting that SocketException , usually comes with an error message that is very informative about the situation that caused the exception .

    What is a socket programing?

    It is programming concept that makes use of socket to establish connection and enables multiple programs to interact with each other using network . Sockets provide an interface to establish communication using network protocol stack and enables programs to share messages over network.

    Sockets are endpoints in network communications . A socket server is usually a multi-threaded server that can accept socket connection requests . A socket client is a program/process that initiates a socket communication request .

    Java.net.SocketException: Соединение reset

    79 [2008-09-15 16:36:00]

    Я получаю следующую ошибку, пытающуюся прочитать из сокета. Я делаю readInt() в этом InputStream , и я получаю эту ошибку. Прослушивание документации показывает, что клиентская часть соединения закрыла соединение. В этом случае я сервер.

    У меня есть доступ к файлам журнала клиента, и он не закрывает соединение, и на самом деле его файлы журнала предполагают, что я закрываю соединение. Так кто-нибудь есть идея, почему это происходит? Что еще проверить? Это происходит, когда есть локальные ресурсы, которые, возможно, достигают пороговых значений?

    Я отмечаю, что у меня есть следующая строка:

    непосредственно перед readInt() . Есть причина для этого (длинный рассказ), но просто любопытно, существуют ли обстоятельства, при которых это может привести к указанной ошибке? У меня есть сервер, работающий в моей среде IDE, и мне пришлось оставить свою среду IDE на точке останова, и я заметил, что те же самые ошибки появляются в моих собственных журналах в моей среде IDE.

    В любом случае, просто упомянув об этом, надеюсь, не красная сельдь.: — (

    java networking sockets connection socketexception

    79 EJP [2010-11-29 07:11:00]

    Существует несколько возможных причин.

    На другом конце умышленно reset соединение, таким образом, что я не буду документировать здесь. Редко и, как правило, неверно, для прикладного программного обеспечения это делать, но это не известно для коммерческого программного обеспечения.

    Чаще всего это вызвано записью на соединение, что другой конец уже закрыт нормально. Другими словами, ошибка протокола приложения.

    Это также может быть вызвано закрытием сокета, когда в буфере приема сокета есть непрочитанные данные.

    В Windows «программное обеспечение вызвало прерывание соединения», которое не совпадает с «соединением reset», вызвано сбоем сетевых проблем с вашего конца. Здесь есть статья базы знаний Microsoft.

    29 erickson [2008-09-15 17:03:00]

    Соединение reset просто означает, что был получен TCP RST. Это происходит, когда ваш партнер получает данные, которые он не может обработать, и для этого могут быть разные причины.

    Простейшим является закрытие сокета, а затем запись большего количества данных в выходной поток. Закрыв сокет, вы сказали своему коллеге, что вы закончили говорить, и он может забыть о вашем соединении. Когда вы все равно отправляете больше данных об этом потоке, эксперт отвергает его с помощью RST, чтобы вы знали, что он не прослушивает.

    В других случаях промежуточный брандмауэр или даже сам удаленный хост могут «забыть» о вашем TCP-соединении. Это может произойти, если вы не отправляете какие-либо данные в течение длительного времени (2 часа — общий тайм-аут), или потому, что сверстник перезагружен и потерял информацию об активных соединениях. Отправка данных по одному из этих несовместимых соединений вызовет также RST.

    Обновление в ответ на дополнительную информацию:

    Посмотрите внимательно на обработку SocketTimeoutException . Это исключение возникает, если превышен установленный тайм-аут при блокировке операции сокета. Состояние самого сокета не изменяется при вызове этого исключения, но если ваш обработчик исключений закрывает сокет, а затем пытается его записать, вы будете в состоянии соединения reset. setSoTimeout() призван дать вам чистый способ выйти из операции read() , которая в противном случае могла бы блокироваться навсегда, без каких-либо грязных действий, таких как закрытие сокета из другого потока.

    7 GEOCHET [2008-09-15 16:45:00]

    Всякий раз, когда у меня были такие странные проблемы, я обычно сажусь с помощью инструмента WireShark и смотрю на переданные необработанные данные назад и вперед. Вы можете быть удивлены, когда что-то отключается, и вы только уведомляетесь, когда пытаетесь прочитать.

    5 Scott S [2013-07-23 20:10:00]

    Смутившись сказать это, но когда у меня возникла эта проблема, было просто ошибкой, что я закрывал соединение, прежде чем я прочитал все данные. В случаях, когда возвращались маленькие строки, это сработало, но, вероятно, из-за того, что весь ответ был буферизирован, я не закрыл его.

    В случае большего количества возвращаемого текста исключение было выбрано, так как больше возвращался буфер.

    Вы можете проверить этот контроль. Помните, что открытие URL-адреса похоже на файл, обязательно закройте его (отпустите соединение) после его полного чтения.

    Вы должны тщательно осмотреть весь след,

    У меня есть приложение для подключения к серверу и исправлено событие java.net.SocketException: Connection reset .

    В моем случае это происходит при чтении с объекта clientSocket Socket , который по какой-то причине закрывает его соединение. (Потеря сети, брандмауэр или сбой приложения или предполагаемое закрытие)

    Читать еще:  Raspberry pi 2 что можно сделать

    На самом деле я восстанавливал соединение, когда получал ошибку при чтении с этого объекта Socket.

    Интересно, что for my JAVA Socket , если клиент подключается к моему ServerSocket и закрывает его соединение, не отправляя ничего is.read() вызывает себя рекурсивно. Кажется, из-за того, что в бесконечном цикле для чтения из этого сокета вы пытаетесь для чтения из закрытого соединения. Если вы используете что-то вроде операции чтения,

    Затем вы получаете stackTrace, как показано ниже, и

    То, что я сделал, — это просто закрыть ServerSocket и обновить мое соединение и ждать дальнейших входящих клиентских подключений.

    Это восстанавливает мое соединение для неизвестного потерянного сокета клиента

    Я не мог найти другого способа, потому что, как вы видите ниже, вы не можете понять, потеряно ли соединение или нет без try and catch , потому что все кажется правильным. Я получил этот снимок, пока я непрерывно получал Connection reset .

    3 kml_ckr [2011-03-27 23:30:00]

    У меня была такая же ошибка. Я нашел решение проблемы сейчас. Проблема заключалась в том, что клиентская программа заканчивалась до того, как сервер прочитал потоки.

    2 Pino [2015-05-08 15:24:00]

    У меня была эта проблема с системой SOA, написанной на Java. Я работал как с клиентом, так и с сервером на разных физических машинах, и они отлично работали в течение длительного времени, затем эти неприятные сбрасывания соединений появились в журнале клиентов, и в журнале сервера не было ничего странного. Перезапуск клиента и сервера не помогло решить проблему. Наконец, мы обнаружили, что куча на стороне сервера была довольно полной, поэтому мы увеличили доступную память для JVM: проблема решена! Обратите внимание, что в журнале не было OutOfMemoryError: память была просто скудной, а не исчерпанной.

    java.net.SocketException: Connection reset

    I am getting the following error trying to read from a socket. I’m doing a readInt() on that InputStream , and I am getting this error. Perusing the documentation this suggests that the client part of the connection closed the connection. In this scenario, I am the server.

    I have access to the client log files and it is not closing the connection, and in fact its log files suggest I am closing the connection. So does anybody have an idea why this is happening? What else to check for? Does this arise when there are local resources that are perhaps reaching thresholds?

    I do note that I have the following line:

    just prior to the readInt() . There is a reason for this (long story), but just curious, are there circumstances under which this might lead to the indicated error? I have the server running in my IDE, and I happened to leave my IDE stuck on a breakpoint, and I then noticed the exact same errors begin appearing in my own logs in my IDE.

    Anyway, just mentioning it, hopefully not a red herring. 🙁

    Создан 15 сен. 08 2008-09-15 13:36:42 Anonymous

    Do you have stack traces from both sides? Can you describe the network architecture a bit more? (Over the wild Internet? On the same machine? Somewhere in between?) Does it happen all the time? Or intermittently? – Stu Thompson 15 сен. 08 2008-09-15 13:45:39

    Whenever I have had odd issues like this, I usually sit down with a tool like WireShark and look at the raw data being passed back and forth. You might be surprised where things are being disconnected, and you are only being notified when you try and read.

    Создан 15 сен. 08 2008-09-15 13:45:06 GEOCHET

    Connection reset simply means that a TCP RST was received. This happens when your peer receives data that it can’t process, and there can be various reasons for that.

    The simplest is when you close the socket, and then write more data on the output stream. By closing the socket, you told your peer that you are done talking, and it can forget about your connection. When you send more data on that stream anyway, the peer rejects it with an RST to let you know it isn’t listening.

    In other cases, an intervening firewall or even the remote host itself might «forget» about your TCP connection. This could happen if you don’t send any data for a long time (2 hours is a common time-out), or because the peer was rebooted and lost its information about active connections. Sending data on one of these defunct connections will cause a RST too.

    Update in response to additional information:

    Take a close look at your handling of the SocketTimeoutException . This exception is raised if the configured timeout is exceeded while blocked on a socket operation. The state of the socket itself is not changed when this exception is thrown, but if your exception handler closes the socket, and then tries to write to it, you’ll be in a connection reset condition. setSoTimeout() is meant to give you a clean way to break out of a read() operation that might otherwise block forever, without doing dirty things like closing the socket from another thread.

    Создан 15 сен. 08 2008-09-15 14:03:55 erickson

    Not correct in several respects. Garbage collection and process exits both cause proper closes, not resets, but a close followed by a write by the peer can induce a reset rather than an EOS. SocketTimeoutExceptions are only raised if the reader has set a read timeout. – EJP 30 сен. 12 2012-09-30 00:21:14

    Читать еще:  Что значит локальная учетная запись

    And it doesn’t always mean an RST was received. It can also mean one was generated by this side. – EJP 14 апр. 17 2017-04-14 17:35:03

    EJP still salty 5 yrs later? – Daedric 19 июн. 17 2017-06-19 19:17:09

    @Daedric Still *uncorrected,* nearly *ten* years later. You may prefer blatant errors to persist here indefinitely. I don’t. – EJP 01 июн. 18 2018-06-01 23:49:48

    There are several possible causes.

    The other end has deliberately reset the connection, in a way which I will not document here. It is rare, and generally incorrect, for application software to do this, but it is not unknown for commercial software.

    More commonly, it is caused by writing to a connection that the other end has already closed normally. In other words an application protocol error.

    It can also be caused by closing a socket when there is unread data in the socket receive buffer.

    In Windows, ‘software caused connection abort’, which is not the same as ‘connection reset’, is caused by network problems sending from your end. There’s a Microsoft knowledge base article about this.

    Создан 29 ноя. 10 2010-11-29 04:11:56 EJP

    Ошибка Android: java.net.SocketException: сокет закрыт

    Я вижу, что эта ошибка возникает в моих журналах сбоев сотни раз в неделю, но я потратил на этом этапе несколько недель, пытаясь преследовать ошибку без каких-либо успехов. Я не смог воспроизвести его на любом из моих устройств. Вот трассировка стека:

    Вот блок кода, откуда исходит ошибка … точное место возникновения сбоя – HttpResponse response = httpclient.execute(httppost); :

    Любая помощь при окончательном вычислении этого результата очень ценится!

    На мой взгляд, виновником этой проблемы является не ваше приложение, а удаленная сторона (т. Е. HTTP-сервер). Наиболее вероятно, что HTTP-сервер внезапно SocketException соединение, и это вызывает SocketException в вашем приложении. В производственных условиях это происходит довольно часто. Это может быть вызвано перегрузкой HTTP-сервера, некоторыми исключительными обстоятельствами, которые могут привести к закрытию сервера (нагрузка HTTP-запроса или даже увеличение количества запросов, когда на удаленном сервере закончились ресурсы, на сервере также может закончиться Его локальный пул сокетов … причины могут быть десятки).

    Если доля этих ошибок невысока по сравнению с успешными HTTP-запросами, я бы не стал волноваться, я бы просто обернул этот фрагмент кода в try < . >catch (SocketException e) < . >И показать пользователю диалоговое окно, в котором сообщается, что запрос не выполнен, и они должны повторить попытку.

    То, что я, безусловно, сделаю, это попытаться определить причину такого поведения: я постараюсь сопоставить время одного из этих исключений и попытаться в течение долгого времени копаться в журналах HTTP-сервера, чтобы попытаться определить причину этого внезапного Отключение (при условии, что у вас есть доступ к этим журналам и другим диагностическим инструментам). Как я уже говорил, это может быть глупо или немного сложнее отладить, но я бы сказал, что это проблема.

    Исключение «java.net.SocketException: Socket closed» может происходить в разных ситуациях. Либо серверная сторона закрыла соединение, как nKn, либо клиентская сторона (ваше приложение) закрыла соединение. Даже если вы не знаете об этом, может быть несколько менее очевидный код, который может привести к закрытию сокета, например Thread.interrupt () или ExecutorService.shutdownNow ().

    Если, с другой стороны, это действительно происходит на стороне сервера, я бы посоветовал вам внедрять повторные попытки – 3 попытки являются обычной практикой и обычно достаточны.

    В настоящее время вы принимаете любые настройки по умолчанию, с которыми сконфигурирована клиентская библиотека. Возможно, вы хотите больше контролировать свой Httpclient lib, особенно в отношении установки TIMEOUT сокета. Не ожидайте, что сервер сделает что-то неожиданное. Установите более короткий тайм-аут, чем значение по умолчанию, и контролируйте ошибки таким образом, который будет иметь смысл для ваших пользователей. «Попробуйте позже msg» ….

    Если вы используете по умолчанию android httpclient, вы можете захотеть взглянуть на альтернативы, которые не отстают от новых версий Apache-клиентов …

    Общий фоновый асинхронный клиент

    И обратите внимание, что с любым из них вы можете принять во внимание (по Wi-Fi) ИЛИ (на 4G), что вы можете набирать подробные профили тайм-аута, где вы контролируете таймауты с кодом, как показано ниже:

    Используя обработчики и обратные вызовы для пользовательского интерфейса, чтобы вы могли показать любой диалог оповещения, который вы хотите

    В runnable, где у вас есть «..client.exec (request $ Type)»

    Назад в поток пользовательского интерфейса вы управляете предупреждением для как можно большего количества обработчиков diff.

    При необходимости вы можете установить профили тайм-аута разности по доменам. Требуется время, чтобы изучить все материалы строителя и файлы конфигурации с этими двумя другими пакетами httpclient, но, возможно, стоит потратить время, потому что вы можете настроить его на все, что хотите, и у вас есть полный контроль над исключениями и того, что вы хотите Вернуться к пользовательскому интерфейсу.

    Что вы делаете с объектом HttpPost, возвращаемым из метода postData (…)? Это может быть одной из причин для рассмотрения. Обратите внимание, что есть два потока, один основной поток и другой, который вы создаете выше.

    В блоке finally вам нужно закрыть ресурсы, такие как httpClient и
    А также полностью очистить входной поток ответов. См. Примеры для справки.

    Явно установить кодировку на UrlEncodedFormEntity, может быть в UTF-8

    Ссылка на основную публикацию
    Adblock
    detector