thread - java tcp socket




java.net.SocketException:軟件導致連接中止:recv失敗 (7)

這個問題在這裡已經有了答案:

我無法找到適當的答案,以確定以下錯誤的含義:

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

筆記:

  • 這個錯誤很少且不可預測; 雖然獲取此錯誤意味著將來所有URI請求也將失敗。
  • 有效的唯一解決方案(也是偶爾)是重啟Tomcat和/或實際的機器(本例中是Windows)。
  • URI絕對可用(通過要求瀏覽器進行提取來確認)。

相關代碼:

BufferedReader reader;
try { 
 URL url = new URL(URI);
 reader = new BufferedReader(new InputStreamReader(url.openStream())));
} catch( MalformedURLException e ) { 
 throw new IOException("Expecting a well-formed URL: " + e); 
}//end try: Have a stream

String buffer;
StringBuilder result = new StringBuilder();
while( null != (buffer = reader.readLine()) ) { 
 result.append(buffer); 
}//end while: Got the contents.
reader.close();


嘗試將“autoReconnect = true”添加到jdbc連接字符串


如果您的TLS客戶端無法由配置為需要客戶端身份驗證的服務器進行身份驗證,也會發生這種情況。


我也有這個問題。 我的解決方案是:

sc.setSoLinger(true, 10);

從網站複製 - >通過使用setSoLinger()方法,您可以在發送重置之前明確設置延遲,從而為讀取或發送數據setSoLinger()出更多時間。

也許這不是每個人的答案,而是某些人的答案。


查看您是否在http端口上運行了其他服務或程序。 當我嘗試使用該端口並且它被另一個程序佔用時,它發生在我身上。


當連接突然關閉時(當發送緩衝區中仍有數據時重置TCP連接時)會發生此錯誤。 這種情況非常類似於更常見的“由同伴重置連接”。 它可能在通過Internet連接時偶爾發生,但如果時機正確則會系統地發生(例如,在localhost上保持連接)。

HTTP客戶端應該只是重新打開連接並重試請求。 重要的是要理解,當一個連接處於這種狀態時,除了關閉它之外沒有任何方法可以解決它。 任何發送或接收的嘗試都會產生相同的錯誤。

不要使用URL.open() ,使用Apache-Commons HttpClient ,它具有重試機制,連接池,保持活動和許多其他功能。

示例用法:

HttpClient httpClient = HttpClients.custom()
            .setConnectionTimeToLive(20, TimeUnit.SECONDS)
            .setMaxConnTotal(400).setMaxConnPerRoute(400)
            .setDefaultRequestConfig(RequestConfig.custom()
                    .setSocketTimeout(30000).setConnectTimeout(5000).build())
            .setRetryHandler(new DefaultHttpRequestRetryHandler(5, true))
            .build();
// the httpClient should be re-used because it is pooled and thread-safe.

HttpGet request = new HttpGet(uri);
HttpResponse response = httpClient.execute(request);
reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
// handle response ...

這通常意味著存在網絡錯誤,例如TCP超時。 我首先在連接上放置一個嗅探器(wireshark),看看你是否能看到任何問題。 如果存在TCP錯誤,您應該能夠看到它。 此外,如果適用,您可以檢查路由器日誌。 如果任何地方都涉及無線,那麼這就是這類錯誤的另一個來源。





sockets