我正在阅读 Socket InputStream,调用 read() 和 available() 可以进行几次循环迭代。稍后 available() 无限期阻塞!
可能是什么问题?我怎样才能使它成为非阻塞的?
代码:
BufferedInputStream buffIn = new BufferedInputStream(in);
while (true)
{
if (buffIn.available() > 0)
{
len = buffIn.read(buffer, 0, buffer.length);
if (len == -1)
{
break;
}
baos.write(buffer, 0, len);
}
}
最佳答案
available() 对于套接字来说不是一个好主意,因为它不能按预期工作。我会在这个地方使用非阻塞 NIO。
SocketChannel sc = ...
sc.configureBlocking(false);
ByteBuffer bb = ByteBuffer.allocateDirect(32*1024);
while(sc.read(bb) > 0) {
bb.flip();
while(bb.remaining() > 0 && sc.write(bb) >= 0);
bb.clear();
}
这比 IO 版本更有效,因为它不会将数据复制到 Java scape 中只是为了将其复制回来(它保存了两个副本)
编辑循环的规范版本如下:
while (in.read(bb) > 0 || bb.position() > 0)
{
bb.flip();
out.write(bb);
bb.compact();
}
关于java - Socket InputStream 在 available()/read() 上阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20552223/