How to Fix with java.net.SocketException: Connection reset Exception in Java? Examples
Hello guys, for the past few months, I have been writing about different socket-related errors on Java applications, and today I am going to talk about another common socket-related exception in Java — java.net.SocketException: Connection reset Exception. There is no difference between exceptions thrown by the client and server. This is also very similar to the java.net.SocketException: Failed to read from SocketChannel: Connection reset by a peer but there is some subtle difference. The difference between connection reset and connection reset by peer is that the first means that your side reset the connection, the second means the peer did it. Nothing to do with clients and servers whatsoever
The java.net.SocketException: Connection reset error usually comes when one of the parties in TCP connection like client or server is trying to read/write data, but other parties abruptly close the connection like it was crashed, stopped, or terminated.
You will also not receive this error if the Client closes the connection using the close() method before sever sends the response. This occurred when Server closed the connection, while the client is still waiting to read data from its InputStream.
For example, if you are using BufferedReader for writing data then it will block if you don’t write \n or line terminator on the message.
Similarly, on the server side you will see the following error :
Exception in thread "main" java.net.SocketException: Connection reset at java.net.SocketInputStream.read(Unknown Source) at sun.nio.cs.StreamDecoder.readBytes(Unknown Source
This occurs when the Server is reading data and blocked on a read() call but the client was terminated, this time you saw the message on the server-side. As you can see we get a SocketException with the message Connection reset. This happens when one of the parties closes the connection without using the close() method.
How to solve java.net.SocketException: Connection reset Exception in Java
If you are a client and getting this error while connecting to the server-side application then you can do the following things:
1. First, check if the Server is running by doing telnet on the host port on which the server runs.
In most cases, you will find that either server is not running or restarted manually or automatically.
2. Check if the server was restarted
3. Check if the server failed over to a different host
5. Report the problem to the server team
Though, as a Java programmer, you should have good knowledge of Socket API, both old and new and if you need the recommendation to level up your skill, I suggest you join a comprehensive Java course like The Complete Java Programming MasterClass course by Tim Buchalaka on Udemy. It’s not only the most comprehensive course but also the most up-to-date and covers news features from recent Java releases.
That’s all about how to deal with the java.net.SocketException: Connection reset Exception in Java. As I told you it doesn’t matter whether this error is coming on server-side Java application or client-side Java application then underlying cause is always that the other party terminated the connection or the connection is lost due to network issues. You also cannot rule out the possibility of that host is restarted or the server-side application crashed.
- java.sql.SQLException: No suitable driver found for ‘jdbc:mysql://localhost:3306/mysql [Solution]
- How to solve java.lang.ClassNotFoundException: com.mysql.jdbc. Driver error? (hint)
- java.sql.SQLServerException: The index 58 is out of range — JDBC (solution)
- How to fix Caused By: java.lang.NoClassDefFoundError: org/apache/log4j/Logger (solution)
- org.Springframework.Web.Context.ContextLoaderListener (solution)
- How to connect to MySQL database in Java? (tutorial)
- Fixing java.lang.UnsupportedClassVersionError Unsupported major.minor version 50.0 (solution)
- How to fix ‘javac’ is not recognized as an internal or external command (solution)
- java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory error (solution)
- Common reasons of java.lang.ArrayIndexOutOfBoundsException in Java? (solution)
- java.lang.ClassNotFoundException :
- How to avoid ConcurrentModificationException in Java? (tutorial)
- How to solve the «could not create the Java virtual machine» error in Java? (solution)
- 10 common reasons for java.lang.NumberFormatException in Java? (tutorial)
- How to fix the «illegal start of expression» compile-time error in Java? (tutorial)
- Cause and solution of «class, interface, or enum expected» compiler error in Java? (fix)
- How to solve java.lang.OutOfMemoryError: Java Heap Space in Eclipse, Tomcat? (solution)
- How to fix «Error: Could not find or load main class» in Eclipse? (guide)
- How to solve java.lang.classnotfoundexception oracle.jdbc.driver.oracledriver? (solution)
- How to solve «variable might not have initialized» compile-time error in Java? (answer)
P. S. — It’s worth noting that both Socket and Network Programming is advanced skill and worth learning. If you want to learn more about Socket Programming in Java, I suggest you check the Java: Socket Programming Simplified, a free course on Udemy.
Ошибка 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
Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.
Видим, что вы не нашли ответ на свой вопрос.
Напишите комментарий, что можно добавить к статье, какой информации не хватает.