今天的文章将讨论Java中可能出现的
java.net.SocketException: Connection Reset
错误的原因和解决方案。 最后,我们将看到如何消除 Java 的
java.net.SocketException:Connection Reset
错误。
Java 中的 java.net.SocketException
SocketException 是 IOException 的子类。 它作为已检查异常的状态是有保证的。
当尝试打开或访问套接字时,可能发生的最常见的异常表明存在问题。 如果你查看服务器端,你会得到以下错误:
java.net.SocketException: Connection reset
Java中java.net.SocketException: Connection Reset的原因
当客户端在通过套接字发回响应之前终止与套接字的连接时,服务器上会引发
java.net.SocketException: Connection reset
。 假设您可以在从服务器获取响应之前关闭浏览器。
TCP RST 数据包是远程端通知您传输最后一个 TCP 数据包的连接未得到确认的方式。 连接重置表明 TCP RST 已成功接收。
这可能是因为连接不再处于活动状态。 毕竟端口关闭或者其他原因。
重置数据包的简单定义不包含任何内容,并且在 TCP 标头标志中设置了 RST 位。 以下是可能发生
java.net.SocketException: Connection reset
错误的一些原因:
由于从远程系统接收到关闭命令,TCP 套接字已关闭。
这也可能是由于服务器排队的大量请求导致请求在客户端查看之前超时。 您还可以检查服务器的健康状况和日志,看看是否造成了重负载。
关闭套接字接收缓冲区中包含未读数据的套接字也可能导致此错误。
另一端的连接已被有意重置。 虽然这种情况很少见并且不适合应用软件,但商业软件并不罕见。
应用程序协议不正确,或者您尝试写入在完成之前已终止的连接。
在 Java 中重现 java.net.SocketException:Connection reset 错误并确定其原因
示例代码(Server.java 文件):
package
com.demobrokenpipe;
import
java.net.*;
import
java.io.*;
public
class
Server
{
public
static
void
main
(String[] args)
throws
Exception{
ServerSocket
socket
=
new
ServerSocket
(
6666
);
System.out.println(
"The Server Is Initialized"
);
Socket
conn
=
socket.accept();
System.out.println(
"A Request Is Received"
);
BufferedReader
reader
=
new
BufferedReader
(
new
InputStreamReader
(conn.getInputStream()));
System.exit(
1
);
conn.close();
示例代码(Client.java 文件):
package
com.demobrokenpipe;
import
java.net.*;
import
java.io.*;
public
class
Client
{
public
static
void
main
(String argv[])
throws
Exception {
Socket
socket
=
new
Socket
(
"localhost"
,
6666
);
PrintWriter
out
=
new
PrintWriter
(socket.getOutputStream(),
true
);
out.write(
"Hi"
);
System.out.println(
"Incorrect String"
);
BufferedReader
bufferReader
=
new
BufferedReader
(
new
InputStreamReader
(socket.getInputStream()));
System.out.println(bufferReader.read());
在这里,我们有两个类,Server.java 和 Client.java,连接到端口号 6666。我们打开两个终端并运行这两个文件以在客户端和服务器之间进行通信,但它会打印一条消息和一个错误,如下所示。
错误描述:
Incorrect String
Exception
in
thread
"main"
java.net.SocketException: Connection reset
让我们通过 Socket、SocketException 和 SocketException: Connectin Reset 来了解导致此错误的原因。
我们使用套接字在两个或多个程序中建立成功的连接,以便使用同一网络相互通信。 在我们的例子中,我们有两个程序:Client.java 和 Server.java。
通过使用Sockets,我们获得了一个通过网络协议栈进行通信的接口,并让程序在同一网络上共享消息。
简而言之,我们可以说套接字是网络通信的端点。 通常,socket服务器是多线程的,可以接受不同客户端发送的socket连接请求。
SocketException 是 IOException 的子类,因此它是一个受检查的异常。 当我们尝试访问或打开套接字时会发生这种情况。 查看 SocketException 错误的完整异常层次结构。
完整的异常层次结构:
每当客户端关闭套接字连接时,都会导致服务器端出现 SocketException,因为尚未通过该套接字返回响应。 是的,你说得对。
当客户端在完全接收到响应之前关闭套接字连接时,我们会在服务器端收到 java.net.SocketException: Connection Reset 错误。
这里,连接重置意味着远程端点通知您发送最后一个 TCP 数据包的连接无法识别。 造成这种情况的原因可能有多种。
让我们在下面找到它们:
用户在完全获得响应之前关闭了 Web 浏览器。
最常见的是,我们尝试写入的连接已正常关闭。 我们也可以说存在应用程序协议错误。
另一种可能性是所需的端口不再打开。 当客户端关闭套接字而未读数据仍在套接字接收缓冲区中时,我们也会看到此错误。
如果您是Windows用户,您可能会发现这是由于软件导致连接中止。 新手会将其与连接重置混淆。
请记住,两者并不相同。 当我们在从端发送时遇到一些网络问题时,该软件会导致连接中止。
另一种情况是使用 Java Socket 的
setSoTimeout()
方法,该方法通过传递一个必须大于 0 的超时值来启用/禁用 SO_TIMEOUT 选项。传递 0 也是导致
SocketException: Connection Reset
错误的一个原因。
现在,问题是我们是否也要关闭 Client.java 文件中的连接? 让我们在下面找到它。
修复 Java 中的 java.net.SocketException:Connection reset 错误
如果我们作为客户端在与服务器连接时遇到此错误,我们可以通过执行以下任一操作来修复此错误:
确保服务器通过主机端口上的 telnet 运行。 该端口是服务器运行的位置。
确认服务器是否重新启动。
评估同一服务器是否故障转移到不同的主机。
此外,如果我们克服了上一节中描述的原因,我们就可以找到解决方案。 在我们的例子中,删除
System.exit(1)
修复了错误,因为它正在退出系统并关闭程序。
示例代码(Server.java 文件):
import
java.net.*;
import
java.io.*;
public
class
Server
{
public
static
void
main
(String[] args)
throws
Exception{
ServerSocket
socket
=
new
ServerSocket
(
6666
);
System.out.println(
"The Server Is Initialized"
);
Socket
conn
=
socket.accept();
System.out.println(
"A Request Is Received"
);
BufferedReader
reader
=
new
BufferedReader
(
new
InputStreamReader
(conn.getInputStream()));
System.out.println(reader.readLine());
conn.close();
示例代码(Client.java 文件):
import
java.net.*;
import
java.io.*;
public
class
Client
{
public
static
void
main
(String argv[])
throws
Exception {
Socket
socket
=
new
Socket
(
"localhost"
,
6666
);
PrintWriter
out
=
new
PrintWriter
(socket.getOutputStream(),
true
);
out.write(
"Hi"
);
System.out.println(
"Incorrect String"
);
BufferedReader
bufferReader
=
new
BufferedReader
(
new
InputStreamReader
(socket.getInputStream()));
System.out.println(bufferReader.read());
发布时间:2023/07/10
浏览次数:103
分类:
Java
本篇文章介绍了使用 Minecraft 时出现远程主机错误强制关闭现有连接的原因和解决方案。Minecraft 上 Java.IO.IOException: An Existing Connection Was Forcibly Closed by the Remote Host 原因
Java Struts2 框架 java.lang.NoSuchFieldError: EMPTY_BYTE_ARRAY 错误解决
Gson -- Java-JSON 序列化和反序列化入门
如何在 Java 中检查或检测数组中的重复元素
Java Struts 框架 java.lang.ClassNotFoundException: XXX.dispatcher.FilterDispatcher 错误
关于 Java 中的松散耦合你需要知道的一切
处理 Java 异常时应避免的 7 个常见错误
Java 中的 HashMap 和 Hashtable 有什么区别?
Java中为什么wait,notify 和 notifyAll 在同步块或方法中调用
Java中 HashMap 的工作原理