2010-10-18 151 views
3

我有一些奇怪的套接字行爲正在進行。我使用setSoTimeout設置了5秒的超時時間。在我的情況下,這應該是充足的時間。根據在線Java文檔,如果超時,應該拋出一個SocketTimeoutException。它還表示套接字仍然有效。所以我想抓住它然後繼續。然而,而不是內部捕獲,外部捕獲IOException捕捉的說法,當我輸出到日誌的細節,它說這是一個SocketTimeoutException。另一個令人困惑的事情是,我將超時從5秒改爲15秒,並記錄每次讀取所花費的時間,時間總是在毫秒範圍內,甚至從未接近1秒。任何想法都非常感謝。Android - 套接字超時

ReadThread代碼片段

@Override 
public void run() 
{ 
    try 
    { 
     while (true) 
     { 
      byte[] sizeBuffer = new byte[BYTES_FOR_MESSAGE_SIZE]; 

      int bytesRead = this.inputStream.read(sizeBuffer); 

      int length = 0; 

      for (int i = 0; i < BYTES_FOR_MESSAGE_SIZE; i++) 
      { 
       int bitsToShift = 8 * i; 
       int current = ((sizeBuffer[i] & 0xff) << bitsToShift); 
       length = length | current; 
      } 

      byte[] messageBuffer = new byte[length]; 


      this.socket.setSoTimeout(5000); //5 second timeout 

      try 
      { 
       this.inputStream.read(messageBuffer); 
      } 
      catch(java.net.SocketTimeoutException ste) 
      { 
       Log.e(this.toString(), "---- SocketTimeoutException caught ----"); 
       Log.e(this.toString(), ste.toString()); 
      } 

     } 
    } 
    catch (IOException ioe) 
    { 
     Log.e(this.toString(), "IOException caught in ReadThread"); 
     Log.e(this.toString(), ioe.toString()); 
     ioe.printStackTrace(); 
    } 
    catch (Exception e) 
    { 
     Log.e(this.toString(), "Exception caught in ReadThread"); 
     Log.e(this.toString(), e.toString()); 
     e.printStackTrace(); 
    } 

    this.interfaceSocket.socketClosed(); 

}// end run 

回答

1

唯一的例外可能是夾在第一次嘗試捕獲因爲this.inputStream.read較早調用的()。你有兩個這樣的電話:一個在外面嘗試,一個在內部嘗試。

您是否驗證數據是否正在讀取?如果正在讀取數據,那麼您應該期望讀取操作在幾毫秒後返回。如果數據沒有被讀取,那麼讀取操作應該在指定的時間內在那裏阻塞。也許這與你設置SoTimeout的順序有關(也許這樣做可能會有所幫助)。

祝你好運, B-Rad公司

2

我與布萊恩同意。您可能在第一次閱讀時獲得暫停,而不是第二次。一次設置的超時將保持有效,直到您再次更改爲止。如果你閱讀'消息',你的第二次閱讀呼叫似乎假定(a)它將讀取整個消息,並且(b)如果整個消息在5秒內沒有到達,它將超時。它不這樣工作。它會超時如果沒有什麼到達5秒內,或其他它將讀取任何已到達,直到message.length。但它只能是一個字節。

您應該使用DataInputStream.readFully()來讀取整個消息,並且您需要完全重新考慮您的超時策略。