- Как обрабатывать Java SocketException
- 1. введение
- 2. Причины исключения SocketException
- 2.1. Медленная сеть
- 2.2. Вмешательство брандмауэра
- 2.3. Длительное Простое Соединение
- 2.4. Ошибка приложения
- 3. Обработка исключения SocketException
- 4. Заключение
- Ошибка java.net.SocketException: Conection reset – как исправить
- Простое клиент-серверное приложение
- Как решить проблему с SocketException
- java.net.SocketException in Java with Examples
Как обрабатывать Java SocketException
Узнайте, что вызывает SocketException в Java и как с ним справиться.
1. введение
В этом кратком руководстве мы рассмотрим причины возникновения SocketException на примере.
Мы также, конечно, обсудим, как справиться с этим исключением.
2. Причины исключения SocketException
Наиболее распространенной причиной SocketException является запись или чтение данных в закрытое сокет соединение или из него. Еще одна причина этого-закрытие соединения перед чтением всех данных в буфере сокета.
Давайте подробнее рассмотрим некоторые общие причины.
2.1. Медленная сеть
Основной проблемой может быть плохое сетевое соединение. Установка более высокого таймаута соединения сокета может уменьшить скорость SocketException для медленных соединений:
socket.setSoTimeout(30000); // timeout set to 30,000 ms
2.2. Вмешательство брандмауэра
Сетевой брандмауэр может закрывать соединения сокетов. Если у нас есть доступ к брандмауэру, мы можем отключить его и посмотреть, решит ли он проблему.
В противном случае мы можем использовать инструмент мониторинга сети, такой как Wireshark для проверки активности брандмауэра.
2.3. Длительное Простое Соединение
Простаивающие соединения могут быть забыты на другом конце (для экономии ресурсов). Если мы должны использовать соединение в течение длительного времени, мы можем отправлять сообщения heartbeat , чтобы предотвратить состояние ожидания.
2.4. Ошибка приложения
И последнее, но не менее важное: SocketException может возникнуть из-за ошибок или ошибок в нашем коде.
Чтобы продемонстрировать это, давайте запустим сервер на порту 6699:
SocketServer server = new SocketServer(); server.start(6699);
Когда сервер будет запущен, мы будем ждать сообщения от клиента:
serverSocket = new ServerSocket(port); clientSocket = serverSocket.accept(); out = new PrintWriter(clientSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String msg = in.readLine();
Как только мы его получим, мы ответим и закроем соединение:
out.println("hi"); in.close(); out.close(); clientSocket.close(); serverSocket.close();
Итак, допустим, клиент подключается к нашему серверу и посылает “привет”:
SocketClient client = new SocketClient(); client.startConnection("127.0.0.1", 6699); client.sendMessage("hi");
Но, если клиент отправляет другое сообщение:
client.sendMessage("hi again");
Поскольку клиент отправляет “привет снова” на сервер после прерывания соединения, возникает SocketException .
3. Обработка исключения SocketException
Обработка SocketException довольно проста и понятна. Подобно любому другому проверенному исключению, мы должны либо выбросить его, либо окружить блоком try-catch.
Давайте рассмотрим исключение в нашем примере:
try < client.sendMessage("hi"); client.sendMessage("hi again"); >catch (SocketException e)
Здесь мы закрыли клиентское соединение после того, как произошло исключение. Повторная попытка не сработает, потому что соединение уже закрыто. Вместо этого мы должны начать новую связь:
client.startConnection("127.0.0.1", 6699); client.sendMessage("hi again");
4. Заключение
В этой статье мы рассмотрели, что вызывает SocketException и как с этим справиться.
Ошибка java.net.SocketException: Conection reset – как исправить
Сразу сообщу, что если у вас проблема с игрой майнкрафт, то листайте в самый конец статьи, а пока информация для разработчиков и программистов.
В этом примере мы поговорим о java.net.SocketException. Это подкласс IOException, поэтому это проверенное исключение, которое сигнализирует о проблеме при попытке открыть или получить доступ к сокету.
Настоятельно рекомендуется использовать самый «определенный» класс исключений сокетов, который более точно определяет проблему. Стоит также отметить, что SocketException, выдаётся на экран с сообщением об ошибке, которое очень информативно описывает ситуацию, вызвавшую исключение.
Простое клиент-серверное приложение
Чтобы продемонстрировать это исключение, я собираюсь позаимствовать некоторый код из клиент-серверного приложения, которое есть в java.net.ConnectException. Он состоит из 2 потоков.
- Поток 1 – SimpleServer, открывает сокет на локальном компьютере через порт 3333. Потом он ожидает установления соединения. Если происходит соединение, он создает входной поток и считывает 1 текстовую строчку, от клиента, который был подключен.
- Поток номер 2 – SimpleClient, подключается к сокету сервера, открытого SimpleServer. Он отправляет одну текстовую строчку.
Получается, что 2 потока будут в разных классах, запущенных двумя разными основными методами, чтобы вызвать исключение:
package com.javacodegeeks.core.socketecxeption; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketTimeoutException; public class SimpleServerApp < public static void main(String[] args) throws InterruptedException < new Thread(new SimpleServer()).start(); >static class SimpleServer implements Runnable < @Override public void run() < ServerSocket serverSocket = null; try < serverSocket = new ServerSocket(3333); serverSocket.setSoTimeout(0); while (true) < try < Socket clientSocket = serverSocket.accept(); BufferedReader inputReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); System.out.println("Client said :"+ inputReader.readLine()); >catch (SocketTimeoutException e) < e.printStackTrace(); >> > catch (IOException e1) < e1.printStackTrace(); >finally < try < if (serverSocket != null) < serverSocket.close(); >> catch (IOException e) < e.printStackTrace(); >> > > >
package com.javacodegeeks.core.socketecxeption; import java.io.IOException; import java.io.PrintWriter; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException; public class SimpleClientApp < public static void main(String[] args) < new Thread(new SimpleClient()).start(); >static class SimpleClient implements Runnable < @Override public void run() < Socket socket = null; try < socket = new Socket("localhost", 3333); PrintWriter outWriter = new PrintWriter(socket.getOutputStream(), true); System.out.println("Wait"); Thread.sleep(15000); outWriter.println("Hello Mr. Server!"); >catch (SocketException e) < e.printStackTrace(); >catch (InterruptedException e) < e.printStackTrace(); >catch (UnknownHostException e) < e.printStackTrace(); >catch (IOException e) < e.printStackTrace(); >finally < try < if (socket != null) socket.close(); >catch (IOException e) < e.printStackTrace(); >> > > >
Как вы можете видеть, я поместил в SimpleClient 15-секундную задержку, прежде чем попытаться отправить свое сообщение. К тому моменту, когда клиент вызывает sleep(), он уже создал соединение с сервером. Я собираюсь запустить оба потока, и после того, как клиент установит соединение, я внезапно остановлю клиентское приложение.
Вот что происходит на стороне сервера:
java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:196) at java.net.SocketInputStream.read(SocketInputStream.java:122) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177) at java.io.InputStreamReader.read(InputStreamReader.java:184) at java.io.BufferedReader.fill(BufferedReader.java:154) at java.io.BufferedReader.readLine(BufferedReader.java:317) at java.io.BufferedReader.readLine(BufferedReader.java:382) at com.javacodegeeks.core.lang.NumberFormatExceptionExample. SimpleServerApp$SimpleServer.run(SimpleServerApp.java:36) at java.lang.Thread.run(Thread.java:744)
Мы получаем исключение SocketException с сообщением «Сброс подключения». Это происходит, когда один из участников принудительно закрывает соединение без использования close().
Конечно, вы можете сделать оперативное закрытие соединения, не закрывая приложение вручную. В коде клиента, после ожидания в течение 15 секунд (или меньше), вы можете выдать новое исключение (используя throws new Exception ()), но вы должны удалить finally, иначе соединение будет нормально закрываться, и SocketException не будет сброшен.
Как решить проблему с SocketException
SocketException – это общее исключение, обозначающее проблему при попытке доступа или открытия Socket. Решение этой проблемы должно быть сделано с особой тщательностью. Вы должны всегда регистрировать сообщение об ошибке, которое сопровождает исключение.
В предыдущем примере мы видели код сообщения. Это происходит, когда один из участников принудительно закрывает соединение без использования close(). Это означает, что вы должны проверить, был ли один из участников неожиданно прерван.
Также может быть сообщение «Слишком много открытых файлов», особенно если вы работаете в Linux. Это сообщение обозначает, что многие файловые дескрипторы открыты для системы. Вы можете избежать этой ошибки, если перейдете в /etc/sysctl.conf и увеличите число в поле fs.file-max. Или попытаться выделить больше стековой памяти.
Конечно, можно встретить много других сообщений. Например, «Ошибка привязки», где ваше соединение не может быть установлено, поскольку порт не может быть привязан к сокету. В этом случае проверьте, используется ли порт и т. д.
Если у вас проблема с minecraft, то чтобы решить проблему попробуйте сделать следующее:
- Обновите джаву, скачайте по ссылке https://www.java.com/ru/download/ новую версию и установите;
- Возможно блокирует антивирус или брандмауэр. Отключите антивирус и добавьте minecraft в список исключения в брандмауэре (или его можно выключить на время).
- При запуске игры, в правом нижнем углу отображается версия игры, если у вас не последняя версия, то обновите.
- Если у вас много расширений и модов, то это может приводить к багам, удалите последние установленные моды – это может решить проблему.
- Если вы используете платный сервер и у вас закончилась подписка, то опять же у вас будет такая ошибка.
Средняя оценка 2.1 / 5. Количество голосов: 104
Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.
Видим, что вы не нашли ответ на свой вопрос.
Напишите комментарий, что можно добавить к статье, какой информации не хватает.
java.net.SocketException in Java with Examples
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:
java.lang.Object java.lang.Throwable java.lang.Exception java.io.IOException java.net.SocketException
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.
Implemented Interfaces: Serializable Direct Known Subclasses: BindException, ConnectException, NoRouteToHostException, PortUnreachableException
What is socket programming?
It is a programming concept that makes use of sockets to establish connections and enables multiple programs to interact with each other using a network. Sockets provide an interface to establish communication using the network protocol stack and enable programs to share messages over the 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
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 response 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.
Now as of implementation it is clear that we need two programs one handling the client and the other handling the server. They are as follows:
Example 1: Server-side