2010-01-24 158 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

的情況說明如下,客戶端會拋出這樣的例外:

服務器要求進行身份驗證客戶端證書,但客戶端提供了擴展的密鑰使用不支持客戶端身份驗證證書,因此服務器不接受客戶端的證書,然後將其關閉連接。

相關問題