[英]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()是錯誤的位置
您還沒有給我們提供太多信息,特別是關於客戶端的信息。 但我懷疑客戶方是:
神秘。
根據您更新的問題,它看起來不像以上那樣。 以下是其他幾種可能性:
另一個可能的解釋是你有一個內存泄漏,並且由於GC在內存不足時花費的時間越來越多,導致速度減慢。 如果已啟用它們,它將顯示在GC日志中。
我認為在高並發期間,Tomcat中設置的套接字超時已過期且連接已關閉。 Tomcat對該連接的下一次讀取大於服務器中指定的服務器套接字超時。
如果要避免此問題,則必須增加服務器端的超時(在您的情況下已過期)。 但不可取。
順便說一句,你沒有提供足夠的信息。 你是否在Tomcat中增加了連接線程的數量? 如果你這樣做,肯定會發生這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.