我正在一个服务器上读取客户端发送的数据,但是大小不知道我也不能更改客户端发送大小。
我想从客户端读取数据,直到它阻塞并等待服务器的响应。我试过用 available()
,它有时会工作,但有时即使流中有一些数据,它也会返回零。
while((len = in.available()) != 0)
in.read(b,0,len);
有没有办法在Java中这样做?我知道异步方法,但从未尝试过,所以如果有人可以提供一个简短的例子。
我正在一个服务器上读取客户端发送的数据,但是大小不知道我也不能更改客户端发送大小。
我想从客户端读取数据,直到它阻塞并等待服务器的响应。我试过用 available()
,它有时会工作,但有时即使流中有一些数据,它也会返回零。
while((len = in.available()) != 0)
in.read(b,0,len);
有没有办法在Java中这样做?我知道异步方法,但从未尝试过,所以如果有人可以提供一个简短的例子。
运用 available()
是不使用异步方法的唯一方法。
你真的不需要依赖于返回的值 available()
;只需检查是否有“某些”数据可用以确保这一点 read
不会阻止。但是,您必须检查返回的值 read
(读入数组的实际字节数):
// Process all data currently available
while (in.available() != 0)
{
int nb = in.read(b);
// Process nb bytes
}
注意 available
返回0并不意味着达到了数据的结束 - 它只是意味着没有可用于立即消费的数据(数据可能在下一毫秒内可用)。因此,您需要有一些其他机制,以便服务器知道客户端将不再发送任何数据并且正在等待响应。
InputStream
的JavaDoc 对于该方法 available()
明确指出
请注意,虽然InputStream的某些实现将返回 流中的总字节数,很多都不会。永远不会 正确使用此方法的返回值来分配缓冲区 旨在保存此流中的所有数据。
你应该尝试一下 read()
将数据读入分配有4096字节的固定大小缓冲区的方法。
我尝试了很多解决方案,但我找到的唯一一个没有阻止执行的解决方案是:
BufferedReader inStream = new BufferedReader(new
InputStreamReader(yourInputStream));
String line;
while(inStream.ready() && (line = inStream.readLine()) != null) {
System.out.println(line);
}