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



我想检查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);
        }
    }

available()可能会告诉您 bytes 可用的数量,如果实现了,但是没有什么可以告诉您是否有一个完整的 line 其他而不是试图阅读它。

您需要在单独的线程中阅读。

问题是readLine()导致客户端挂在服务器上,如果客户不允许访问访问。

因此,问题实际上是因为服务器应该发送某物'如果不允许客户访问',即表示这样的消息,而不是什么都不做。您不能将缺少消息用作阻塞I/O系统中的消息。

您还需要检查 null的每个 readLine()结果,如果您在阅读插座时获得它。

创建一个bufferedInputStream的新实例,并在该对象上可用:

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

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

编辑:输入不匹配消失。正如Java文档所说,InputStream.available() emwly 返回零。与此相比,BufferedInputStream返回„剩下的字节数可以在缓冲区中读取"

最新更新