我正在服务器上读取客户端发送的数据,但是大小不知道我也不能更改客户端以发送大小。
我想从客户端读取数据,直到它阻塞并等待服务器的响应。我尝试使用available()
,它有时会工作,但有时即使流中有一些数据,它也会返回零。
while((len = in.available()) != 0)
in.read(b,0,len);
有没有办法在Java中这样做?我知道异步方法,但从未尝试过,所以如果有人可以提供一个简短的例子。
答案 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的某些实现将返回 流中的总字节数,很多都不会。永远不会 正确使用此方法的返回值来分配缓冲区 旨在保存此流中的所有数据。
您应该尝试使用read()
方法将数据读入分配有4096字节的固定大小缓冲区。
答案 2 :(得分:1)
我尝试了很多解决方案,但我找到的唯一一个没有阻止执行的解决方案是:
BufferedReader inStream = new BufferedReader(new
InputStreamReader(yourInputStream));
String line;
while(inStream.ready() && (line = inStream.readLine()) != null) {
System.out.println(line);
}