26 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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: сброс соединения?

мы видим часто java.net.SocketException: Connection reset ошибки в наших журналах для компонента, который вызывает стороннюю веб-службу, которая отправляет SMS-сообщения.

наше приложение написано на Java и работает на базе Tomcat 5.5. Его написали подрядчики, которых у нас больше нет. Текущая команда не имеет реального опыта Java, и мы не уверены, где Connection reset ошибка на самом деле и откуда, и как идти об отладке.

проблема кажется полностью прерывистой, и не связаны с сообщениями, которые мы пытаемся отправить.

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

весь стек вызовов включен ниже для полноты.

( com.companyname.mtix.sms это наша составляющая)

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

13 ответов:

javadoc для SocketException утверждает, что это

брошенный, чтобы указать, что есть ошибка в базовом протоколе, таком как ошибка TCP

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

чтобы помочь отладке вы можете посмотреть на использование такого инструмента, как Wireshark для просмотра фактического сетевой пакет. Кроме того, есть ли альтернативный клиент для вашего кода Java, который вы могли бы использовать для тестирования веб-службы? Если это было успешно, это может указывать на ошибку в коде Java.

Как вы используете Commons HTTP Client посмотрите на общее руководство по ведению журнала HTTP-клиента. Это расскажет вам, как зарегистрировать запрос на уровне HTTP.

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

причиной является соединение внутри HttpClient несвежее. Проверка устаревшего соединения для SSL не устраняет эту ошибку. Решение: сбросьте свой клиент и воссоздайте его.

при попытке доступа к веб-службам, развернутым на сервере Glassfish3, может потребоваться настроить параметры пула http-потоков. Это фиксированные SocketExceptions у нас было, когда многие параллельные потоки вызывали веб-службу.

  1. перейти в консоль администратора
  2. перейдите к «конфигурации»->»конфигурация сервера»->»пулы потоков»->»http-thread-pool».
  3. изменить параметр «максимальный размер пула потоков» с 5 до 32
  4. изменить параметр «мин Размер пула потоков» от 2 до 16
  5. Перезапустить Glassfish.
Читать еще:  Что делать если сгорела видеокарта на компьютере

в моем случае это было потому, что мой кот был установлен с недостаточным maxHttpHeaderSize для особо сложного запроса SOLR.

надеюсь, что это поможет кому-то там!

Я тоже наткнулся на эту ошибку. В моем случае проблема была в том, что я использовал JRE6, с поддержкой TLS1.0. Сервер поддерживал только TLS1.2, поэтому эта ошибка была выдана.

Я получаю эту ошибку все время и считают это нормальным.

Это происходит, когда одна сторона пытается читать, когда другая сторона уже повесил трубку. Таким образом в зависимости от протокола это может или не может обозначить проблему. Если мой клиентский код специально указывает серверу, что он собирается повесить трубку, то клиент и сервер могут повесить трубку одновременно, и это сообщение не произойдет.

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

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

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

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

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

Я знаю, что этот поток немного стар, но хотел бы добавить мои 2 цента. У нас была такая же ошибка «сброса соединения» сразу после нашего одного из выпусков.

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

Это старый поток, но я столкнулся с java.net.SocketException: Connection reset вчера.

в серверном приложении были изменены настройки регулирования, чтобы разрешить только 1 соединение за раз! Таким образом, иногда звонки проходили, а иногда нет. Я решил проблему, изменив настройки регулирования.

Я тоже получал именно эту ошибку: Connection reset by peer . Исключение был поднят по шаблону остальных источников при выполнении postForObject() метод. Для меня проблемой был слишком длинный HTTP URL запрос. Поэтому сначала проверьте, является ли созданный URL-адрес тем, что он должен быть, и если ваш сервер действительно должен иметь возможность обрабатывать запросы такой длины, просто перейдите к конфигурации сервера и поднимите допустимую длину URL-запросов по умолчанию.

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

надеюсь, что это помогает.

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

я столкнулся с этой проблемой. Это вызвано заблокированными сеансами в базе данных, которые связаны с таблицами, которые вы собираетесь изменить через Webservice.

найти заблокированные идентификаторы сеанса:

это должно дать вам подсказки о том, что таблица заблокирована, но еще не завершает изменения.

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.
  • 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: Connection reset by peer: socket w

    Базовые технологии Java /

    Пробовал проверять сокет перед отправкой на что только можно:

    Читал, что проверить сокет можно только попробовав записать в него что то, верно глосят?
    Тогда у меня нет другого выхода, как тупо обработать эксепшен в моей задачи, получив что то нечто?:

    А может (так у меня закрывается клиентская часть)

    не посылает команду на закрытия сокета и поробовать что то типо такого:

    Но я не знаю команду для закрытия, поэтому не смог проверить.
    И если это от части верно подскажите «куда читать» .
    С уважением, Роман

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

    RaD1KaL
    Возможно я не понял вашу мысль, но я не вижу смысла в данном подходе. Что он дает?

    to All
    В итоге после добавления java windowClosing event :

    в консоль сервера не сипется предыдущий эксепшен, вообще тишина, что не может не радовать.
    Но сервер по прежнему считает что сокет открыт и обрабатывает это условие:

    Тут (код на стороне сервера):

    Как так получается?

    Так же в клиент стал сыпаться эксепшен:

    Попробовал как написал ниже, не сработало.
    ..может глупо, но это к тому что не ленился, искал выход..
    Экшен на закрытие (код на стороне клиента):

    Метод где сыпется эксепшен (код на стороне клиента):

    Как этот эксепшен обработать?

    С уважением, Роман.

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

    Может еще стоит посмотреть на процесс разрыва соединения через сниффер? Вроде wireshark.

    Не совсем понимаю что там искать?! Чего то у меня не получается, нету ни чего что бы хоть как то дало мне понять что это мои запросы.
    Возможно сказывается что и сервер и клиент пока на одной машине, для тестирования, и пакеты идут через петлю? Хотя IP для работы указан как на сетевой карте.
    ..имею поверхностное представления что такое wireshark, и не юзал для определенных целей ни разу..

    Подскажите как? Так же через сниффер?
    Конечно метод пытается считать данные из уже закрытого сокета, я же его закрыл, повешав события на крестик. см.выше

    to All
    Как я понял это так(эксепшеном) выходится из цикла в методе.
    Может есть что то более корректное, чем не работающий этот код:
    ..повторюсь, что я передаю false в isActive при закрытие клиентского окна..

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

    И! Почему, после закрытия клиентского приложения, передав команду на закрытия сокета, сервер после обработки данных вернувшись класс сокета с данными для отправки, считает что сокет запущен?
    ..проходит проверка. см.выще..

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

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

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

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

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

    Читать еще:  Checking nvram что делать

    Если доля этих ошибок невысока по сравнению с успешными 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

    Thread: Socketexception :Connection reset

    LinkBack
    Thread Tools
    Search Thread
    Display
    • Linear Mode
    • Switch to Hybrid Mode
    • Switch to Threaded Mode

    Socketexception :Connection reset

    I got the below exception .how to resolve this .It’s receiving the data up to 10 min then suddenly below error happening
    I have embedded the source code below

    Kindly help me it’s very urgent

    java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at MultiThreadedSocketServer$ClientServiceThread.run( MultiThreadedSocket
    Server.java:130)

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;

    public class MultiThreadedSocketServer <

    ServerSocket myServerSocket;
    boolean ServerOn = true;

    public MultiThreadedSocketServer()
    <
    try
    <
    myServerSocket = new ServerSocket(5020);
    >
    catch(IOException ioe)
    <
    System.out.println(«Could not create server socket on port 5020. Quitting.»);
    System.exit(-1);
    >
    Calendar now = Calendar.getInstance();
    SimpleDateFormat formatter = new SimpleDateFormat(«E yyyy.MM.dd ‘at’ hh:mm:ss a zzz»);
    System.out.println(«It is now : » + formatter.format(now.getTime()));

    // Successfully created Server Socket. Now wait for connections.
    while(ServerOn)
    <
    try
    <
    // Accept incoming connections.
    Socket clientSocket = myServerSocket.accept();

    // accept() will block until a client connects to the server.
    // If execution reaches this point, then it means that a client
    // socket has been accepted.

    // For each client, we will start a service thread to
    // service the client requests. This is to demonstrate a
    // Multi-Threaded server. Starting a thread also lets our
    // MultiThreadedSocketServer accept multiple connections simultaneously.

    // Start a Service thread

    ClientServiceThread cliThread = new ClientServiceThread(clientSocket);
    cliThread.start();

    >
    catch(IOException ioe)
    <
    System.out.println(«Exception encountered on accept. Ignoring. Stack Trace :»);
    ioe.printStackTrace();
    >

    try
    <
    myServerSocket.close();
    System.out.println(«Server Stopped»);
    >
    catch(Exception ioe)
    <
    System.out.println(«Problem stopping server socket»);
    System.exit(-1);
    >

    public static void main (String[] args)
    <
    new MultiThreadedSocketServer();
    >

    class ClientServiceThread extends Thread
    <
    Socket myClientSocket;
    boolean m_bRunThread = true;

    public ClientServiceThread()
    <
    super();
    >

    ClientServiceThread(Socket s)
    <
    myClientSocket = s;

    public void run()
    <
    // Obtain the input stream and the output stream for the socket
    // A good practice is to encapsulate them with a BufferedReader
    // and a PrintWriter as shown below.
    BufferedReader in = null;
    PrintWriter out = null;

    // Print out details of this connection
    System.out.println(«Accepted Client Address — » + myClientSocket.getInetAddress().getHostName());

    try
    <
    in = new BufferedReader(new InputStreamReader(myClientSocket.getInputStream()) );
    out = new PrintWriter(new OutputStreamWriter(myClientSocket.getOutputStream( )));

    // At this point, we can read for input and reply with appropriate output.

    // Run in a loop until m_bRunThread is set to false
    while(m_bRunThread)
    <

    Ссылка на основную публикацию
    Статьи c упоминанием слов:
    Adblock
    detector