首页 文章

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

提问于
浏览
134

Given this stack trace snippet

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

I tried to answer the following questions:

  • 什么代码抛出此异常? (JVM?/ Tomcat?/我的代码?)

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

Regarding #1:

Sun 's JVM source doesn' t包含此确切消息,但我认为文本软件导致连接中止:套接字写入错误来自 SocketOutputStream 的本机实现:

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

Regarding #2

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

Questions:

  • 上述假设是否正确(#1和#2)?

  • 这可能与情况不同:“由于服务器端的网络错误,”无法写入客户端“?或者会呈现相同的错误消息?

  • 最重要的是: Is there an official document (e.g from Sun) stating the above?

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

12 回答

  • 4

    您检查过Tomcat源代码和JVM源吗?这可能会给你更多帮助 .

    我认为你的一般思路很好 . 我希望在你不能以客户端为导向的场景中使用 ConnectException .

  • 1

    对于使用简单的客户端服务器程序并获得此错误的任何人来说,这是一个未闭合(或早期关闭)输入或输出流的问题 .

  • 4

    "This error can occur when the local network system aborts a connection, such as when WinSock closes an established connection after data retransmission fails (receiver never acknowledges data sent on a datastream socket)." . 见this MSDN article . 另见Some information about 'Software caused connection abort' .

  • 2

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

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

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

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

    希望这可以帮助 .

  • 0

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

  • 48

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

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

    详细消息示例:

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

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

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

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

    当连接到遥控器时出现问题,可能会发生这种情况 . 例如due to virus-checker rejecting the remote mail requests .

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

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

    可能的解决方案:确保你're writing the correct length of bytes to the stream. So double check what you'重新发送 . 见thread .

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

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

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

    • 通过对等方重置连接 .

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

    • 连接重置 .

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

    见:What's causing my java.net.SocketException: Connection reset?

  • 2

    我面临同样的问题 .
    通常由于客户端已关闭其连接而服务器仍在尝试在该客户端上写入,因此会发生此类错误 .
    所以一定要确保你的客户端的连接打开,直到服务器完成其输出流 .
    还有一件事,别忘了 close input and output stream.

    希望这可以帮助 .
    如果仍然面临问题,请详细说明您的问题 .

  • -1

    我在使用SoapUI客户端测试我的soap服务时发生了这个错误,基本上我试图获得一个非常大的消息(> 500kb)并且SoapUI通过超时关闭连接 .

    在SoapUI上转到:文件 - >首选项 - 套接字超时(毫秒)

    ...并且输入一个很大的值,例如180000(3分钟),这对你的问题不是一个完美的解决方案,因为文件实际上很大,但至少你会有一个响应 .

  • -1

    另一个客户端的已关闭连接

    就我而言,错误是:

    java.net.SocketException: Software caused connection abort: recv failed
    

    在调试访问H2数据库的java应用程序时,它是在eclipse中收到的 . 错误的来源是我最初使用SQuirreL打开数据库以手动检查完整性 . 我确实使用该标志来启用到同一个DB的多个连接(即 AUTO_SERVER=TRUE ),因此从java连接到DB没有问题 .

    一段时间后出现错误 - 这是一个很长的java进程 - 我决定关闭SQuirreL来释放资源 . 看起来好像SQuirreL是“拥有”数据库服务器实例的那个,并且它是通过SQuirreL连接关闭的 .

    重新启动Java应用程序不会再次产生错误 .

    config

    • Windows 7

    • Eclipse Kepler

    • SQuirreL 3.6

    • org.h2.Driver ver 1.4.192

  • 9

    我的服务器在传递2天内抛出此异常,我通过移动断开连接功能解决了它:

    outputStream.close();
    inputStream.close();
    Client.close();
    

    到列表结束的线程 . 如果它会帮助任何人 .

  • 0

    在下面解释的情况下,客户端将抛出这样的异常:

    要求服务器验证客户端证书,但客户端提供扩展密钥用法不支持客户端身份验证的证书,因此服务器不接受客户端的证书,然后关闭连接 .

  • -3

    在模拟其余的API调用时,我遇到了与wireMock相同的问题 . 之前我正在定义服务器,如下所示:

    WireMockServer wireMockServer = null;
    

    但它的定义应如下所示:

    @Rule 
    public WireMockRule wireMockRule = new WireMockRule(8089);
    

相关问题