2010-04-26 94 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只有当到达流的末尾。 如果您的协议需要客户端和服务器之间的连续开放连接,则必须以不同的方式检测到消息的结束。