修复 Java.Net.SocketException: Connection Reset 错误
今天的文章将讨论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());
}
}
相关文章
Java 异常 Java.IO.IOException: Connection Reset by Peer
发布时间:2023/07/16 浏览次数:1586 分类:Java
-
本篇文章介绍 Java 的 java.io.IOException: Connection reset by peer。Java 中 java.io.IOException: Connection reset by peer IOException 表示读取或写入文件或访问文件系统时可能发生的任何输入输出异常。
Java 错误 Java.Net.SocketException: Network Is Unreachable
发布时间:2023/07/16 浏览次数:963 分类:Java
-
今天我们就来讨论一下Java编程时出现java.net.SocketException: Network is unreachable异常的可能原因及解决方法。Java中出现java.net.SocketException: Network is unreachable的可能原因及解决方案
Java 错误 Java.Net.ConnectException: Connection Timed Out
发布时间:2023/07/16 浏览次数:235 分类:Java
-
本篇文章将重点介绍如何使用此包进行基本的网络调用以及可能面临和解决的错误。在 Java 中使用 java.net 进行网络调用 进行网络调用是 Java 开发人员每天面临的最重要的事情之一。
修复 Java 中 Java.Net.SocketException: Broken Pipe 错误
发布时间:2023/07/15 浏览次数:530 分类:Java
-
本篇文章介绍了使用 Java 编程的 java.net.SocketException: Broken pipeline 错误,并重点介绍了其可能的原因和解决方案。错误描述、原因及解决方法
Java 中错误 java.net.SocketException: Software Caused Connection Abort: Recv F
发布时间:2023/07/14 浏览次数:693 分类:Java
-
本篇文章介绍如何解决 Java 中的以下错误:java.net.SocketException: Software caused connection abort: recv failed SocketException 是 IOException 的子类,当我们尝试访问套接字时会发生 IOException。
Java 错误 Java.Net.SocketTimeoutException: Connection Timed Out
发布时间:2023/07/13 浏览次数:331 分类:Java
-
在本篇文章中,我们将讨论 java.net.SocketTimeoutException: Connection timed out。 但首先,让我们仔细看看套接字和超时的概念。Java 中的套接字 两个计算机应用程序之间的逻辑链接可能有多个端点,其
修复 Java 错误 Java.Net.SocketException: Permission Denied
发布时间:2023/07/11 浏览次数:742 分类:Java
-
本篇文章介绍了 Java 中的 java.net.SocketException:Permission denied 错误。Java中出现 java.net.SocketException: Permission returned 错误的原因 SocketException 通常在网络连接出现问题时发生。
Minecraft 上 An Existing Connection Was Forcibly Closed by the Remote Host 错误
发布时间:2023/07/10 浏览次数:1286 分类:Java
-
本篇文章介绍了使用 Minecraft 时出现远程主机错误强制关闭现有连接的原因和解决方案。Minecraft 上 Java.IO.IOException: An Existing Connection Was Forcibly Closed by the Remote Host 原因
Python 中 ConnectionRefusedError: [Errno 111] Connection Refused 错误
发布时间:2023/05/17 浏览次数:512 分类:Python
-
不应该有任何路由器或防火墙可能会停止通信,因为根据您的网络地址,服务器和客户端都应该在同一个局域网上。为什么 ConnectionRefusedError: [Errno 111] Connection refused 在 Python 中发生