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

问题

给定此堆栈跟踪代码段>引起:java.net.SocketException:软件导致连接中止:java.net.SocketOutputStream.socketWrite0(本机方法)中的套接字写入错误
我试着回答以下问题:-什么代码抛出此异常? (JVM?/ Tomcat?/我的代码?)

  • 什么原因导致抛出此异常?

关于#1:

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

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

关于#2
我的猜测是,它是在客户端终止连接之前,在获得完整响应之前引起的(例如发送请求,但在获得完整响应之前,它已关闭/终止/脱机)
问题:-上述假设是否正确(#1和#2)?

  • 这可能与情况不同:"由于服务器端的网络错误,"无法写入客户端"?或者会呈现相同的错误消息?
  • 最重要的是:是否有正式文件(例如来自Sun)说明上述内容?

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


#1 热门回答(47 赞)

"当本地网络系统中止连接时,例如当WinSock在数据重新传输失败后关闭已建立的连接时(接收方永远不会确认数据流套接字上发送的数据),就会发生此错误。" Seethis MSDN article。另见Some information about 'Software caused connection abort'


#2 热门回答(9 赞)

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

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

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

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

希望这可以帮助。


#3 热门回答(4 赞)

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