问题 阅读Socket中可用的内容而不会阻塞


我正在一个服务器上读取客户端发送的数据,但是大小不知道我也不能更改客户端发送大小。

我想从客户端读取数据,直到它阻塞并等待服务器的响应。我试过用 available(),它有时会工作,但有时即使流中有一些数据,它也会返回零。

while((len = in.available()) != 0)
    in.read(b,0,len);

有没有办法在Java中这样做?我知道异步方法,但从未尝试过,所以如果有人可以提供一个简短的例子。


8858
2017-11-26 09:04


起源



答案:


运用 available() 是不使用异步方法的唯一方法。

你真的不需要依赖于返回的值 available();只需检查是否有“某些”数据可用以确保这一点 read 不会阻止。但是,您必须检查返回的值 read (读入数组的实际字节数):

// Process all data currently available
while (in.available() != 0)
{
    int nb = in.read(b);
    // Process nb bytes
}

注意 available 返回0并不意味着达到了数据的结束 - 它只是意味着没有可用于立即消费的数据(数据可能在下一毫秒内可用)。因此,您需要有一些其他机制,以便服务器知道客户端将不再发送任何数据并且正在等待响应。


7
2017-11-26 09:19





InputStream 的JavaDoc 对于该方法 available() 明确指出

请注意,虽然InputStream的某些实现将返回   流中的总字节数,很多都不会。永远不会   正确使用此方法的返回值来分配缓冲区   旨在保存此流中的所有数据。

你应该尝试一下 read() 将数据读入分配有4096字节的固定大小缓冲区的方法。


5
2017-11-26 09:10





我尝试了很多解决方案,但我找到的唯一一个没有阻止执行的解决方案是:

BufferedReader inStream = new BufferedReader(new 
InputStreamReader(yourInputStream));
String line;
while(inStream.ready() && (line = inStream.readLine()) != null) {
    System.out.println(line);
}

1
2017-09-25 16:39