2012-09-17 50 views
0

可能重複:
java.net.SocketException: Software caused connection abort: recv failed客戶端服務器插槽java.net.SocketException異常:軟件導致連接中止:recv的失敗

我想寫一個客戶端服務器對,其中連接整天都在運行,客戶端等待服務器發送消息。步驟如下:

  1. 服務器打開端口和監聽連接
  2. 客戶端的連接,並等待數據
  3. 一段時間以後(也許小時)的服務器將數據發送到客戶端
  4. 客戶端處理數據並返回到服務器
  5. 重複步驟3和4

我可以得到1-4步的工作,但如果我嘗試重複步驟3,我得到標題中的錯誤。

這是我在客戶端的方法:

private static void waitForInput(SSLSocket sslsocket) throws IOException { 
     do { 
      try { 
       ObjectInputStream ois = new ObjectInputStream(sslsocket.getInputStream()); 
       ObjectOutputStream oos = new ObjectOutputStream(sslsocket.getOutputStream()); 

       Object o = (Object) (ois.readObject()); 
       // excluded code to process data  

       oos.flush(); 
       oos.writeObject(o); 
       oos.reset(); 
      } 
      catch(ClassNotFoundException e){ 
       System.err.println(e.getMessage()); 
      } 
     } while (true); 
    } 

的代碼失敗四號線,圍繞它阻斷第一時間和等待,直到我得到的數據的下位,但它不工作兩次。我究竟做錯了什麼?

+0

什麼是「第四行」?它以什麼方式失敗?你所說的只是它「不起作用」。 –

+0

字面上代碼中的第4行上面有'ObjectInputStream ois = new ObjectInputStream(sslsocket.getInputStream());' 我得到的錯誤是標題中的錯誤 - 'java.net.SocketException:軟件導致連接中止:recv failed' – Sarah

回答

0

連接中止當您等待從另一端已關閉的套接字讀取時拋出IOException異常,請檢查以查看您的服務器端代碼(如果不是偶然關閉套接字)。 此外,服務器端代碼可以上傳更深入的分析,也可以嘗試發佈堆棧跟蹤,這將有助於分析。

+0

你是對的,我正在重新設置連接的另一端,我需要讓它在一天中保持活動狀態。 – Sarah

+0

@Sarah不,它不是。它是由本地網絡堆棧響應傳輸錯誤引起的。如果對方關閉連接,則從API獲得EOS:在這種情況下,會出現EOFException。完全不正確的答案。 -1。 – EJP

0

你可以移動的聲明oisoosdo ... while循環的,因爲沒有必要每次重複聲明它們,可能需要大約一個try ... catch

private static void waitForInput(SSLSocket sslsocket) throws IOException { 
    ObjectInputStream ois = new ObjectInputStream(sslsocket.getInputStream()); 
    ObjectOutputStream oos = new ObjectOutputStream(sslsocket.getOutputStream()); 
    do { 
     try { 

      Object o = (Object) (ois.readObject()); 
      // excluded code to process data  

      oos.writeObject(o); 
      oos.flush(); 
     } 
     catch(ClassNotFoundException e){ 
      System.err.println(e.getMessage()); 
     } 
    } while (true); 
} 

我已刪除了oos.reset();和移動oos.flush();

我認爲這個問題是oos.reset();,我絕不會重置應該是幾個小時持續性,或者,至少一部分的連接的。

此外,該連接已經有一個ois,您不需要其中兩個。

+0

謝謝,是的,我最終將這些調用移出了do循環,就像您提到的那樣。 – Sarah

相關問題