2010-04-26 63 views
0

我想從tcp流中讀取客戶端發送的消息。 事情是讀完最後一行後,我的readline函數沒有返回null,我無法調試爲什麼,因爲控制點丟失。 總之,在讀完最後一行後,readLine函數應該返回null,但我沒有得到任何東西。Java TCP流終止

這是我的代碼是什麼樣子消息

 StringBuffer sipBuffer = null; 
     String lineRead = null; 
     readIn = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     try { 
       sipBuffer = new StringBuffer(); 
       while ((lineRead = readIn.readLine()) != null) { 
        sipBuffer.append(lineRead); 

        sipBuffer.append("\n"); 
       } 
      } catch (Exception ex) { 
       sipConsole.addText("Error in message: \n"); 
       sipConsole.addText(ex.getMessage()); 
       return; 
      } 

格式

String inviteReq = "INVITE sip:" + destIP + "@sip.umsy.edu SIP/2.0" + "\n" 
      + "From: \"" + myName + "\" <sip:" + myIP + "@sip.umsy.edu>" + "\n" 
      + "To: <sip:" + destIP + "@sip.umsy.edu>" + "\n" 
      + "Allow: INVITE, ACK, BYE" + "\r\n"; 

回答

1

客戶端是否已關閉正在寫入的流?如果沒有,您的readLine()會阻止來自客戶端的更多數據。客戶端 - 服務器協議通常建立一個機制(除了流關閉)來指示大小。無論是內容長度還是通過特殊標記。

0

請檢查您是否沖洗和關閉在客戶端的OutputStream不讓自己的InputStreamReader的堵塞,在服務器端永遠等待?

1

的readLine()時,流關閉將返回null。你真的確定這個流被關閉了嗎?

看來你正在閱讀的SIP消息在這種情況下,另一端可能直到調用的進修或至少直到它應答或得到回答之前終止不會關閉連接。您必須遵循SIP協議,並根據SIP規範處理流上的消息。

0

確保一旦發送消息關閉在客戶端的連接。否則,服務器端將阻塞並等待更多數據。

0

我懷疑發送該消息後,客戶端沒有關閉套接字,所以服務器被阻塞等待新的線路。是這樣嗎?

記住的ReadLine()返回null只有當到達流的末尾。 如果您的協議需要客戶端和服務器之間的連續開放連接,則必須以不同的方式檢測到消息的結束。