2012-03-29 69 views
0

我編寫了一個使用無限循環接受客戶端連接的多線程服務器套接字。 每個客戶端連接都將由一個線程處理。JAVA無限服務器套接字無端停止

現在的問題是,在等待大約2個小時而沒有任何連接之後,程序將無故停止(沒有例外)。

timeout設置爲無限:setSoTimeout(0); 這裏的服務器套接字代碼段:

try { 
     while(true) { 
      socket = server.accept(); 
      BufferedReader ois = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      BufferedWriter oos = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
      SocketHandler socketH = new SocketHandler(socket, ois, oos, this); 
      Thread socketT = new Thread(socketH); 
      socketT.start(); 
     } 
    } catch (Exception e) { 
     Debugger.log(e.getClass().toString() + ": " + e.getMessage()); 
    } 

我真的很困惑,任何幫助將非常感激,謝謝!

+0

試着抓住Throwable。也許有些JVM錯誤沒有消息就出來了。 – 2012-03-29 19:27:01

回答

0

現在的問題是,在等待大約2個小時而沒有任何連接之後,程序將無緣無故停止(無例外)。

我覺得這個極其很難相信。我認爲更可能是某種不正確的異常處理比某種JVM故障。

  • 您是否完全確定您會在您的catch中看到輸出行?
  • 您是否內存不足或其他資源?
  • 某種操作系統防火牆是否可以終止休眠服務器套接字?實現

的一件事是,當你做的服務器循環下,他們可能會引發IOException如果有客戶端連接,並立即關閉套接字。

BufferedReader ois = new BufferedReader(
    new InputStreamReader(socket.getInputStream())); 
BufferedWriter oos = new BufferedWriter(
    new OutputStreamWriter(socket.getOutputStream())); 

我建議做這一切客戶線程。只是通過在socket到您的SocketHandler構造:

Thread socketT = new Thread(new SocketHandler(socket)); 

socketTrun()方法然後開始你的IO。

要嘗試的另一件事是不要執行server.accept()與0超時,但將其設置爲一分鐘或某事(60000)和捕獲SocketTimeoutException,然後循環。這不是長期的正確之舉,但它可能會改變問題並更好地揭露問題。

最後,你在外面捕獲Throwable。在錯誤處理方面,這是一件非常重要的事情,但在你弄明白之前,你已經得到了一種安慰。 :-)

+0

謝謝,這是一個消耗內存的服務器,所以當它閒置一段時間後,linux會殺死它... – Yaxing 2012-03-30 03:22:59