迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

修复 Java.Net.SocketException: Connection Reset 错误

作者:迹忆客 最近更新:2023/07/12 浏览次数:

今天的文章将讨论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错误的一些原因:

  1. 由于从远程系统接收到关闭命令,TCP 套接字已关闭。
  2. 这也可能是由于服务器排队的大量请求导致请求在客户端查看之前超时。 您还可以检查服务器的健康状况和日志,看看是否造成了重负载。
  3. 关闭套接字接收缓冲区中包含未读数据的套接字也可能导致此错误。
  4. 另一端的连接已被有意重置。 虽然这种情况很少见并且不适合应用软件,但商业软件并不罕见。
  5. 应用程序协议不正确,或者您尝试写入在完成之前已终止的连接。

在 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 错误的完整异常层次结构。

完整的异常层次结构:

修复 java 中的 Java Net SocketException 连接重置 - 异常层次结构

每当客户端关闭套接字连接时,都会导致服务器端出现 SocketException,因为尚未通过该套接字返回响应。 是的,你说得对。

当客户端在完全接收到响应之前关闭套接字连接时,我们会在服务器端收到 java.net.SocketException: Connection Reset 错误。

这里,连接重置意味着远程端点通知您发送最后一个 TCP 数据包的连接无法识别。 造成这种情况的原因可能有多种。

让我们在下面找到它们:

  1. 用户在完全获得响应之前关闭了 Web 浏览器。
  2. 最常见的是,我们尝试写入的连接已正常关闭。 我们也可以说存在应用程序协议错误。
  3. 另一种可能性是所需的端口不再打开。 当客户端关闭套接字而未读数据仍在套接字接收缓冲区中时,我们也会看到此错误。
  4. 如果您是Windows用户,您可能会发现这是由于软件导致连接中止。 新手会将其与连接重置混淆。

    请记住,两者并不相同。 当我们在从端发送时遇到一些网络问题时,该软件会导致连接中止。

  5. 另一种情况是使用 Java Socket 的 setSoTimeout() 方法,该方法通过传递一个必须大于 0 的超时值来启用/禁用 SO_TIMEOUT 选项。传递 0 也是导致 SocketException: Connection Reset 错误的一个原因。

现在,问题是我们是否也要关闭 Client.java 文件中的连接? 让我们在下面找到它。


修复 Java 中的 java.net.SocketException:Connection reset 错误

如果我们作为客户端在与服务器连接时遇到此错误,我们可以通过执行以下任一操作来修复此错误:

  1. 确保服务器通过主机端口上的 telnet 运行。 该端口是服务器运行的位置。
  2. 确认服务器是否重新启动。
  3. 评估同一服务器是否故障转移到不同的主机。

此外,如果我们克服了上一节中描述的原因,我们就可以找到解决方案。 在我们的例子中,删除 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());
    }
}

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

修复 Java 错误 Java.Net.SocketException: Permission Denied

发布时间:2023/07/11 浏览次数:124 分类:Java

本篇文章介绍了 Java 中的 java.net.SocketException:Permission denied 错误。Java中出现 java.net.SocketException: Permission returned 错误的原因 SocketException 通常在网络连接出现问题时发生。

Python 中 ConnectionRefusedError: [Errno 61] Connection Refused 错误

发布时间:2023/05/16 浏览次数:226 分类:Python

有时在设计客户端-服务器程序时,您可能会遇到错误 ConnectionRefusedError。Python中 ConnectionRefusedError 错误是如何产生的 正如我们已经讨论过的,这个错误主要发生在客户端程序无法连接到服务器

Python 中错误 ConnectionError: Max retries exceeded with url

发布时间:2023/02/14 浏览次数:406 分类:Python

出现错误 ConnectionError: Max retries exceeded with url 有多种原因: 向 request.get() 方法传递了不正确或不完整的 URL。 我们正受到 API 的速率限制。 requests 无法验证您向其发出请求的网站的 SS

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便