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

vid*_*dit 11 java

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

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

while((len = in.available()) != 0)
    in.read(b,0,len);
Run Code Online (Sandbox Code Playgroud)

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

Gro*_*uez 7

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

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

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

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


asg*_*sgs 5

InputStream该方法的 JavaDocsavailable()明确指出

请注意,虽然InputStream的某些实现将返回流中的总字节数,但许多实现不会.使用此方法的返回值来分配用于保存此流中所有数据的缓冲区绝对不正确.

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