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

标签 java sockets blocking

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

相关文章:

java - Elasticsearch从1升级到5 - SearchRequestBuilder.setNoFields

java - 如何在Android Studio中查看异常?

python - python 的 BaseHTTPRequestHandler 中 connfd(在 C 中创建的套接字)的等价物在哪里

c - 优雅地杀死 C 的 pthread 中的阻塞线程?

java - 如果值不存在则更新或检查 DynamoDBMapper 中的条件

java - 无法按日期查询或扫描 DynamoDb

python - 在Python上使用套接字进行通信

c - getaddrinfo 何时返回列表中的多个 sockaddr 结构?

python-3.x - Python SSL 套接字错误 : ssl. SSLWantReadError: The operation did not complete (read)

c - C调用时如何逐行执行Lua函数