【问题标题】:how to detect end of socket InputStream? [duplicate]如何检测套接字 InputStream 的结束? [复制]
【发布时间】:2016-01-22 07:05:35
【问题描述】:

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

服务器

        //...

        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

  • 列表

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

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

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

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

【问题讨论】:

  • 我尝试使用 0,但无论如何它都会挂起。
  • @vlp -1 在 Java 中。 InputStream.read() 不能返回零,除非您提供零长度缓冲区或零计数。

标签: java sockets


【解决方案1】:

API 和关于此类问题的先前答案指出 -1 应该意味着没有要读取的字符

我无法评论一些未引用的答案可能会说什么,但 API 文档没有这样说。它说 -1 在流结束时返回。套接字上的流结束发生在对等端关闭连接或关闭连接以进行输出时,而不是之前。

-1 不是消息结束指示符。

【讨论】:

  • 所以没有这样的事情来检测没有阻止或有自定义协议的情况下没有要读取的字符?
  • @John 没错。如果你想要消息,你必须自己实现它们:行、长度字前缀、XML、XDR 等自描述协议......
  • available() 怎么样(我只是好奇)?
  • @vlp 它返回可以在没有阻塞的情况下读取的字节数,即套接字接收缓冲区中的字节数加上任何中间BufferedInputStreams.它没有任何事情要做与消息。 TCP 中没有与任何相关的消息。这是一个字节流协议。
  • 我将问题解读为如何检测“没有更多字节要读取”(不是如何检测连接已关闭 )。 “在此之后连接应保持打开状态。”部分暗示。我想我基本上了解 TCP 的流性质(甚至这里有an answer ;))。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多