簡體   English   中英

java.net.SocketTimeoutException:讀取超時

[英]java.net.SocketTimeoutException: Read timed out

我有一個客戶端服務器架構的應用程序。 客戶端使用Java Web Start和Java Swing / AWT,sert使用HTTP服務器/ Servlet和Tomcat。 通信是從對象的序列化中創建的,創建一個ObjectOutput序列化一個字節數組並分別發送到服務器並調用ObjectInputStream並反序列化。

應用程序遵循正確的並發通信時間,並開始顯示錯誤“SocketException read timeout”。 當服務器在我的servlet doPost方法中調用方法ObjectInputStream.getObject()時,會發生錯誤。

tomcat將變慢並且錯誤開始減少服務器響應時間,直到我必須重新啟動服務器並且一切正常后的崩潰時間。

有人經歷過這個問題嗎?

客戶代碼

URLConnection conn =  url.openConnection();
conn.setDoOutput(true);

OutputStream os = conn.getOutputStream();
ObjectOutputStream oss = new ObjectOutputStream(os);

oss.writeUTF("protocol header sample");

oss.writeObject(_parameters);
oss.flush();
oss.close();

服務器代碼

ObjectInputStream input = new ObjectInputStream(_request.getInputStream());
String method = input.readUTF();

parameters = input.readObject();

input.readObject()是錯誤的位置

您還沒有給我們提供太多信息,特別是關於客戶端的信息。 但我懷疑客戶方是:

  • 無法設置Content-length標頭(或將其設置為錯誤的值),
  • 無法刷新輸出流,和/或
  • 沒有關閉插座的輸出側。

神秘。

根據您更新的問題,它看起來不像以上那樣。 以下是其他幾種可能性:

  • 出於某種原因,客戶端要么在序列化期間完全鎖定,要么花費很長時間。
  • 客戶端和服務器之間存在導致問題的代理。
  • 您遇到與負載相關的網絡問題或網絡硬件問題。

另一個可能的解釋是你有一個內存泄漏,並且由於GC在內存不足時花費的時間越來越多,導致速度減慢。 如果已啟用它們,它將顯示在GC日志中。

我認為在高並發期間,Tomcat中設置的套接字超時已過期且連接已關閉。 Tomcat對該連接的下一次讀取大於服務器中指定的服務器套接字超時。
如果要避免此問題,則必須增加服務器端的超時(在您的情況下已過期)。 但不可取。
順便說一句,你沒有提供足夠的信息。 你是否在Tomcat中增加了連接線程的數量? 如果你這樣做,肯定會發生這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM