“软件导致连接中止:套接字写入错误”的官方原因

2022-08-31 07:05:17

给定此堆栈跟踪代码段

由以下原因导致:java.net.SocketException: Software 导致连接中止:java.net.SocketOutputStream.socketWrite0(本机方法)处的套接字写入错误

我试图回答以下问题:

  1. 是什么代码引发此异常?(JVM?/Tomcat?/My code?)
  2. 是什么原因导致引发此异常?

关于#1:

Sun的JVM源没有包含这个确切的消息,但我认为文本软件导致连接中止:套接字写入错误来自以下的本机实现:SocketOutputStream

private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
                 int len) throws IOException;

关于#2

我的猜测是,当客户端在获得完整响应之前终止连接时,这是由于它引起的(例如,发送请求,但在获得完整响应之前,它被关闭/终止/离线)

问题:

  1. 上述假设是否正确(#1和#2)?
  2. 这是否可以与“由于服务器端的网络错误而无法写入客户端”的情况区分开来?还是会呈现相同的错误消息?
  3. 最重要的是:是否有官方文件(例如来自Sun)说明上述内容?

我需要有一个证据来证明这个堆栈跟踪是套接字客户端的“错误”,并且服务器无法避免它。(除了捕获异常或使用非 Sun JVM SocketOutputStream,尽管两者都不能真正避免客户端已终止的事实)


答案 1

当本地网络系统中止连接时,例如,当 WinSock 在数据重传失败后关闭已建立的连接时(接收方从不确认数据流套接字上发送的数据),可能会发生此错误。

请参阅此 MSDN 文章。另请参阅有关“软件导致连接中止”的一些信息


答案 2

java.net.SocketException 在创建或访问套接字(如 TCP)时出错。这通常是在服务器终止连接(未正确关闭连接)时引起的,因此在获得完整响应之前。在大多数情况下,这可能是由超时问题引起的(例如,响应花费太多时间或服务器的请求过载),或者客户端发送了 SYN,但它没有收到 ACK(确认连接终止)。对于超时问题,可以考虑增加超时值。

套接字异常通常附带有关问题的指定详细信息消息。

详细消息示例:

  • 软件导致连接中止:recv 失败。

    该错误表示有人试图发送邮件,并且您的服务器已中止连接。如果在连接到数据库时发生这种情况,这可能与使用不兼容的连接器/J JDBC 驱动程序有关。

    可能的解决方案:确保 CLASSPATH 中有适当的库/驱动程序。

  • 软件导致连接中止:连接。

    当连接到遥控器出现问题时,可能会发生这种情况。例如,由于病毒检查器拒绝远程邮件请求

    可能的解决方案:检查病毒扫描服务是否阻止了传出连接请求的端口。

  • 软件导致连接中止:套接字写入错误。

    可能的解决方案:确保向流写入正确的字节长度。因此,请仔细检查您要发送的内容。请参阅此主题

  • 对等方重置连接:套接字写入错误/对等体中止连接:套接字写入错误

    应用程序未检查服务器端的保持活动状态连接是否已超时。

    可能的解决方案:在从连接读取之前,请确保 HttpClient 为非空。E13222_01

  • 由对等方重置连接。

    连接已被对等方(服务器)终止。

  • 连接重置。

    由于请求,连接已被客户端终止或由连接的服务器端关闭。

    请参阅:是什么原因导致我的java.net.SocketException:连接重置?


推荐