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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (22)

给定此堆栈跟踪片段

引起:java.nets.ocketException:软件导致连接中止:套接字写入错误 ...

我试图回答以下问题:

  1. 抛出这个异常的代码是什么?(JVM?/Tomcat?/我的代码?)
  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,尽管两者都没有真正避免客户机已经终止的事实)

提问于
用户回答回答于

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

用户回答回答于

我经常看到这种情况,当工作站/膝上型电脑上的公司防火墙遇到阻碍时,它就会扼杀连接。

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

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

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

扫码关注云+社区