如何检测套接字InputStream的结尾?

时间:2015-10-22 20:54:29

标签: java sockets

以下代码应检测到没有更多字节需要读取。但是它只是挂起,直到客户端连接关闭。

服务器

        //...

        StringBuilder builder = new StringBuilder(128);
        byte[] buffer = new byte[1024];
        int length = 0;

        while ((length = socket.getInputStream().read(buffer)) != -1) {
            System.out.println(length);
            builder.append(new String(buffer));
            System.out.println(builder.toString());
        }

客户端

   //...

    OutputStream stream = clientSocket.getOutputStream();
    stream.write("LIST".getBytes());
    stream.flush();

关于这个问题的API和先前的答案表明-1应该意味着没有要读取的字符,但是这个循环写道:

  • 4

  • LIST

  • 挂起20秒,直到客户端关闭套接字并选择-1来终止循环。

我怎样才能正确检测到流中没有其他字符?

此后连接应保持打开状态。

我可以提前发送字节数或特殊字符,但是有可能检测到即使连接仍处于活动状态,也无法再读取任何内容。

1 个答案:

答案 0 :(得分:4)

  

API和之前关于此类问题的答案指出-1应该表示没有要读取的字符

我无法评论一些未经批准的答案可能会说的内容,但API文档中没有说明这一点。它表示在流结束时返回-1。套接字关闭连接时会发生套接字结束,或者关闭它以进行输出,而不是之前。

-1不是消息指示符的结尾。