Java TCP流终止

时间:2010-04-26 20:24:13

标签: java tcp

我试图从tcp流中读取客户端发送的消息。 事情是在读完最后一行之后,我的readline函数没有返回null,我无法调试原因,因为控制点丢失了。 简而言之,在最后一行读取之后,readLine函数应该返回null,但我没有得到任何东西。

这就是我的代码看起来像

        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";

5 个答案:

答案 0 :(得分:1)

当流关闭时,

readLine()将返回null。你真的确定流关闭了吗?

似乎你正在阅读一条SIP消息,在这种情况下,另一端可能不会在呼叫完成之前关闭连接 - 或至少在它得到应答之前应答或终止。您必须遵循SIP协议,并根据SIP规范处理流上的消息。

答案 1 :(得分:1)

客户端是否已关闭正在写入的流?如果没有,则readLine()阻止来自客户端的更多数据。客户端 - 服务器协议通常建立一种机制(流关闭除外)以指示大小。无论是内容长度还是通过特殊令牌。

答案 2 :(得分:0)

请检查您是否正在刷新并关闭客户端上的OutputStream,以防止您的InputStreamReader被阻塞并在服务器端永远等待?

答案 3 :(得分:0)

发送邮件后,请务必关闭客户端的连接。否则,服务器端将阻塞并等待更多数据。

答案 4 :(得分:0)

我怀疑客户端在发送消息后没有关闭套接字,因此服务器被阻塞等待新行。是这样的吗?

请记住,readline()仅在到达流末尾时才返回null。 如果您的协议需要客户端和服务器之间的持续开放连接,则必须以不同的方式检测消息的结束。