"软件导致连接中止的正式原因:套接字写入错误"

Era*_*dan 147 java sockets tomcat exception stack-trace

鉴于此堆栈跟踪代码段

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

我试着回答以下问题:

  1. 什么代码抛出此异常?(JVM?/ Tomcat?/我的代码?)
  2. 是什么导致抛出此异常?

关于#1:

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

private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
                 int len) throws IOException;
Run Code Online (Sandbox Code Playgroud)

关于#2

我的猜测是,它是在客户端终止连接之前,在获得完整响应之前引起的(例如,发送请求,但在获得完整响应之前,它已关闭/终止/脱机)

问题:

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

我需要证明这个堆栈跟踪是套接字客户端的"错误",并且服务器没有做任何事情来避免它.(除了捕获异常,或使用非Sun JVM SocketOutputStream,但两者都没有真正避免客户端终止的事实)

use*_*421 51

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

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

  • [WSAECONNABORTED - 一个可以理解的解释](http://www.chilkatsoft.com/p/p_299.asp) (4认同)
  • @MatGessel那篇文章只是重复了这个混乱,并添加了一些自己的内容.WSAECONNABORTED是一个Winsock错误代码,因此不可能有伯克利的解释.描述HTTP服务器的情况会产生ECONNRESET,而不是WSAECONNABORTED. (3认同)
  • 这不是一个真正的答案,因为它没有为您提供进一步解决问题的信息.这里的答案基本上是"网络上发生了一些不好的事情".理解哪些进一步的日志和其他活动记录可以让我找出潜在的问题将是非常有帮助的. (2认同)

ken*_*orb 10

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

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

详细消息示例:

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

    该错误表示尝试发送消息,并且连接已被服务器中止.如果在连接到数据库时发生这种情况,则可能与使用不兼容的Connector/J JDBC驱动程序有关.

    可能的解决方案:确保您的CLASSPATH中有正确的库/驱动程序.

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

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

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

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

    可能的解决方案:确保您正在向流中写入正确的字节长度.所以仔细检查你发送的是什么.看到这个帖子.

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

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

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

  • 连接由同行重置.

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

  • 连接重置.

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

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


小智 9

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

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

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

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

希望这可以帮助.

  • 防火墙*阻止*连接.问题是关于重置现有连接. (3认同)