gpt4 book ai didi

java - Socket InputStream 在 available()/read() 上阻塞

转载 作者:行者123 更新时间:2023-12-04 16:47:38 25 4
gpt4 key购买 nike

我正在阅读 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com