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

时间:2011-11-26 09:04:30

标签: java

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

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

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

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

3 个答案:

答案 0 :(得分:7)

使用available()是唯一的方法,无需借助异步方法。

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

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

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

答案 1 :(得分:5)

方法available()

InputStream JavaDocs明确指出

  

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

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

答案 2 :(得分:1)

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

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