2010-01-24 38 views
125

鉴于该堆栈跟踪片断官方理由“软件导致连接中止:套接字写入错误”

产生的原因: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; 

关于#2

我的猜测是,它是在客户端获得完整响应(例如,发送的请求,但得到充分反应之前,它得到了关闭/停止/离线)

问题:

  1. 是上述假设是否正确(#1和#2)?
  2. 可以这样从情况diffrentiated:“无法写入到客户端,由于对服务器侧的网络错误”?或者会呈现相同的错误信息?
  3. 还有最重要的:是否有正式文件(来自Sun e.g),说明上面?

我需要有一个证明,这个堆栈跟踪是套接字客户端的“过错”,并没有什么服务器可以做,以避免它。 (除了捕获异常,或使用非Sun JVM SocketOutputStream,虽然两者都不能真正避免客户端终止的事实)

+0

我在使用Firefox取消下载时遇到此问题 – koppor 2013-10-25 17:26:37

+0

Hey Eran在发送/写入('outs.write(audioBytes);')'byte []'到'OutputStream'时,我也得到这个异常。当用户点击任何其他菜单(发送服务器请求)时音频正在播放和播放时,控制台上出现相同的错误。所以忽略这个异常是安全的吗? – Amogh 2015-03-10 06:46:19

+1

@Amogh - 看起来是的,是的。基本上从答案描述的内容来看,这是一个Windows特定的错误,但我假设在Linux上,您将得到相同的异常,只是使用不同的措辞......(我的外行人对此的理解基本上是这是您发送通过套接字到某个远程位置X和X在中间断开连接,但我确定它不是描述它的最准确的方式) – 2015-03-10 18:35:42

回答

46

“的时候,本地网络系统中止的连接,例如当的WinSock后数据重发失败关闭一个已建立的连接(从未接收机承认上的数据流套接字发送数据),可能会发生这种错误。”。见this MSDN article。另见Some information about 'Software caused connection abort'

+2

[WSAECONNABORTED - 一个可以理解的解释](http://www.chilkatsoft.com/p/p_299.asp) – 2012-11-21 02:18:33

+3

@MatGessel那篇文章只是重复了这个混淆,并且增加了它自己的一些。 WSAECONNABORTED是一个Winsock错误代码,因此它不可能有伯克利的解释。描述有关HTTP服务器的情况将产生ECONNRESET,而不是WSAECONNABORTED。 – EJP 2012-12-04 22:13:34

+0

@EJP, \t 我也在OutputStream中发送/写入(outs.write(audioBytes);)byte []时出现此异常。当用户点击任何其他菜单(发送服务器请求)时音频正在播放和播放时,控制台上出现相同的错误。所以忽略这个异常是安全的吗? – Amogh 2015-03-10 06:47:46

2

您是否检查过Tomcat源代码的JVM源代码?这可能会给你更多的帮助。

我觉得你的总体思路是好的。我期望在无法连接的场景中出现ConnectException。以上看起来非常像客户端驱动。

+3

是的,我查过了。谢谢,Tomcat的消息来源没有包含任何句子的排列。 – 2010-01-24 10:00:50

+1

不,他没有检查过Tomcat源**和** JVM源。 – 2010-01-24 11:32:12

+0

或者如果他检查了JVM源代码,他没有检查全部。 – 2010-01-24 12:12:02

4

为了证明哪个部件发生故障我会用wireshark监视TCP/IP通信,看看谁是actaully关闭端口,也可能超时相关。

+0

没有人关闭端口。操作系统正在中止连接。 – EJP 2014-11-19 09:42:34

+0

@EJP我看到这种情况发生时,得到过载和内存不足。我不确定这是关闭连接的操作系统,但JVM变得疯狂。 – Zee 2015-04-10 22:39:00

+1

@Zee关闭一个端口(在Wireshark中作为FIN可见)和中止连接是不同的。 – EJP 2015-05-27 05:47:46

9

我已经看到了这最经常当工作站/笔记本上的企业防火墙碍事,就杀死了连接。

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

如果机器是有其网络断开连接(例如,WiFi关闭)之后,形成该连接。如果机器连接到企业网络(直接或vpn),则连接形成。

然而,如果机器被连接到一个公共WiFi(或归属网络),则在一个防火墙踢杀死的连接。在这种情况下,将客户端连接到回送接口可以正常工作,而不是回到家庭/公共接口。

希望这会有所帮助。

+2

防火墙*阻止*连接。问题是关于重置现有连接。 – EJP 2016-07-22 23:28:32

3

对于使用简单的客户端服务器programms的和得到这个错误的人,它是未闭合(或关闭,以早期)输入或输出流的问题。

+2

不,它不是。这会导致套接字泄漏,最终会导致FD耗尽。 – EJP 2015-05-27 05:48:47

-1

我的服务器是在通2天抛出此异常,我用移动切断功能解决了这个问题:

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

要上市线程结束。如果它能帮助任何人,那么它就是 。

1

我正面临同样的问题。
通常这种错误是由于客户端已关闭其连接并且服务器仍尝试在该客户端上写入而发生的。
因此,请确保您的客户端连接处于打开状态,直到服务器完成其输出流。
还有一件事,不要忘记关闭输入和输出流。

希望这有助于。
如果仍然面临问题,请详细介绍一下您的问题。

+0

不错答案......... – 2016-06-30 11:46:08

+2

@BhavinChhatrola不,不正确的答案。描述的情况会产生“通过同伴重置连接”,而不是问题中的错误。 – EJP 2017-07-04 01:02:19

2

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

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

详细的消息的示例:

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

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

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

  • 软件引起的连接中止:连接。

    这可能发生在连接到远程时出现问题。例如due to virus-checker rejecting the remote mail requests

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

  • 软件引起的连接中止:套接字写入错误。

    可能的解决方案:确保您正确写入了正确的字节长度。所以仔细检查你发送的内容。看到这个thread

  • 将连接复位:通过对中止套接字写入错误/连接:套接字写入错误

    应用程序没有检查是否保持的连接已经超时在服务器端。

    可能的解决方案:确保HttpClient在从连接读取之前是非空的。由对等E13222_01

  • 连接重置。

    连接已被对等端(服务器)终止。

  • 连接重置。

    该连接已由客户端终止或由于连接的服务器端由于请求请求而关闭。

    见:发生在我身上What's causing my java.net.SocketException: Connection reset?

+0

这6点中只有一个实际上错误地回答了问题。其他几个也不正确。应用程序*不能*'检查服务器端的保持连接是否超时。' 'HttpClient'为'null'不可能导致'SocketException'。不向流写入正确的长度也不会。 – EJP 2017-07-04 01:09:31

0

此错误,同时用了SoapUI客户端测试我的SOAP服务,基本上我试图得到一个非常大的消息(> 500KB)和了SoapUI关闭通过连接超时的。

在了SoapUI去:

文件 - >首选项 - 套接字超时(毫秒)

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

-3

我面临着wireMock同样的问题,同时嘲讽其余的API调用。 早些时候,我定义了服务器这样的:

WireMockServer wireMockServer = null; 

但它应该像如下定义:

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

这会导致'NullPointerException',而不是这个问题。 – EJP 2017-07-04 01:10:02

0

在另一个客户端

关闭的连接在我的情况下,错误是:

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

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

错误出现时,一会儿--IT是一个长期的Java process--我决定关闭的松鼠免费资源之后。看起来好像SQuirreL是“拥有”数据库服务器实例并且它已通过SQuirreL连接关闭。

重新启动Java应用程序没有再产生错误。

配置

  • Windows 7的
  • Eclipse的开普勒
  • 的SQuirreL 3.6
  • org.h2.Driver版本1.4.192
0

的情况说明如下,客户端会抛出这样的例外:

服务器要求进行身份验证客户端证书,但客户端提供了扩展的密钥使用不支持客户端身份验证证书,因此服务器不接受客户端的证书,然后将其关闭连接。

相关问题