Java “的官方理由”;软件导致的连接中止:套接字写入错误“;

Java “的官方理由”;软件导致的连接中止:套接字写入错误“;,java,exception,sockets,tomcat,stack-trace,Java,Exception,Sockets,Tomcat,Stack Trace,给定此堆栈跟踪片段 原因:java.net.SocketException: 软件导致的连接中止: 套接字写入错误位于 java.net.SocketOutputStream.socketWrite0(本机) (方法) 我试图回答以下问题: 引发此异常的代码是什么?(JVM?/Tomcat?/My code?) 引发此异常的原因是什么 关于#1: Sun的JVM源代码不包含这个确切的消息,但我认为文本软件导致连接中止:套接字写入错误来自SocketOutputStream的本机实现: priva

给定此堆栈跟踪片段

原因:java.net.SocketException: 软件导致的连接中止: 套接字写入错误
位于 java.net.SocketOutputStream.socketWrite0(本机) (方法)

我试图回答以下问题:

  • 引发此异常的代码是什么?(JVM?/Tomcat?/My code?)
  • 引发此异常的原因是什么
  • 关于#1:

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

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

    我的猜测是,这是由于客户端在收到完整响应之前终止了连接(例如,发送了请求,但在收到完整响应之前,它关闭/终止/脱机)造成的

    问题:

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

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

    您是否检查了Tomcat源代码和JVM源代码?那可能会给你更多的帮助


    我认为你的总体思路是好的。在无法连接的情况下,我希望出现
    ConnectException
    。上面看起来很像是客户端驱动的。

    为了证明哪个组件出现故障,我将使用监控TCP/IP通信,并查看是谁真正关闭了端口,超时也可能是相关的

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


    看。另请参见。

    我经常看到,当工作站/笔记本电脑上的公司防火墙挡住了去路时,它会终止连接

    我在同一台机器上有一个服务器进程和一个客户端进程。服务器正在侦听所有接口(0.0.0.0),客户端尝试连接到公共/主接口(请注意,不是环回接口127.0.0.1)

    如果机器的网络已断开(如wifi已关闭),则会形成连接。如果机器连接到公司网络(直接或vpn),则形成连接

    但是,如果机器连接到公共wifi(或家庭网络),则防火墙会启动并终止连接。在这种情况下,将客户端连接到环回接口可以正常工作,但不能连接到主/公共接口


    希望这有帮助。

    对于任何使用简单客户机-服务器程序并出现此错误的人,这是一个未关闭(或提前关闭)输入或输出流的问题。

    我的服务器在过去2天内抛出此异常,我通过移动断开功能解决了此问题:

    outputStream.close();
    inputStream.close();
    Client.close();
    
    到列表线程的末尾。
    如果它对任何人都有帮助。

    我也面临同样的问题。
    这种错误通常是由于客户端已关闭其连接,而服务器仍在尝试在该客户端上写入而发生的。
    因此,请确保您的客户端在服务器完成其outputstream之前保持连接打开。
    还有一件事,别忘了关闭输入和输出流

    希望这有帮助
    如果仍然面临问题,请在此处详细介绍您的问题。

    当创建或访问(例如)时出错,将抛出。这通常会在服务器终止连接(未正确关闭连接)时导致,因此在获得完整响应之前。在大多数情况下,这可能是由于超时问题(例如,响应花费的时间太长或服务器的请求太多)造成的,或者是客户端发送了SYN,但没有收到ACK(连接终止确认)。对于超时问题,可以考虑增加超时值。

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

    详细消息示例:

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

      此错误表示有人试图发送消息,而您的服务器已中止连接。如果在连接数据库时发生这种情况,则可能与使用有关

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

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

      当连接到远程设备出现问题时,可能会发生这种情况。比如说

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

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

      可能的解决方案:确保您正在向流中写入正确长度的字节。所以,请仔细检查您发送的内容。看这个

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

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

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

    • 对等方重置连接

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

    • 连接重置

      该连接已被
      WireMockServer wireMockServer = null;
      
      @Rule 
      public WireMockRule wireMockRule = new WireMockRule(8089);
      
      java.net.SocketException: Software caused connection abort: recv failed