如何检查客户端的套接字InputStream是否包含数据?

时间:2017-11-30 20:12:37

标签: java inputstream

我想检查InputStream缓冲区是否包含任何可以读取和输出的数据,而不必先调用readLine()并等待数据。

我调查了available(),但这似乎不起作用,因为它总是输出0。

        while (true)
    {
        fromServer = in.readLine(); //Causing a hang waiting for reply
        System.out.println(fromServer);

        if ((fromUser = stdIn.readLine()) != null) 
        {
            out.println(fromUser);
            fromServer = in.readLine();
            System.out.println(fromServer);
        }
    }

2 个答案:

答案 0 :(得分:0)

available()可能会告诉您可用的字节的数量(如果已实现),但没有任何内容可以告诉您除了尝试读取之外是否还有完整的

您需要在单独的帖子中阅读。

  

问题是readLine()导致客户端因为客户端不允许访问而停止服务器回复。

所以问题实际上是服务器应该发送某些东西'如果客户端不允许访问,那就是这样说的消息,而不是做没有。您无法在阻塞I / O系统中将消息缺失用作消息。

您还需要检查每个 readLine()结果是否为空,如果您在读取套接字时得到它,则需要将其关闭。

答案 1 :(得分:-1)

创建BufferedInputStream的新实例,并在该对象上调用:

InputStream is = ...;
BufferedInputStream bis = new BufferedInputStream(inputStream);
if (bis.available() == 0) {
    // do sth if input is available
}

我尝试使用一个小型服务器客户端应用程序,它对我有用。

编辑:类型不匹配消失了。 正如Java Documentation所说,InputStream.available()总是返回零。与此相比,BufferedInputStream返回“the number of bytes remaining that can be read in the buffer