1

我第一次使用 Jetty 9 EndPoint。
但我不知道如何使用EndPoint.flush(ByteBuffer)方法返回码。
我应该无限循环直到调用成功吗?

Javadoc 只是说

返回: True IFF 所有缓冲区都已被消耗,并且端点已将数据刷新到其目的地(即没有缓冲任何数据)。

顺便说一句,我正在调用的实例是SslConnection$DecryptedEndPoint类型

任何见解都值得赞赏,因为我找不到任何关于为什么不鼓励使用 SocketEndpoint 而首选 SelectChannelEndpoint 的文档。


有点离题,但无论如何;令我惊讶的是,我在NetworkTrafficSelectChannelEndPoint中发现了这一点:
使用操作 |= 而不是 &= (在 jetty-all-9.0.3.v20130506-sources.jar 中找到)

@Override
public boolean flush(ByteBuffer... buffers) throws IOException
{
    boolean flushed=true;
    for (ByteBuffer b : buffers)
    {
        if (b.hasRemaining())
        {
            int position = b.position();
            flushed|=super.flush(b); // <<-- shouldn't it be &=
            int l=b.position()-position;
            notifyOutgoing(b, position, l);
            if (!flushed)
                break;
        }
    }
    return flushed;
}
4

1 回答 1

1

如果 EndPoint.flush() 无法写入整个缓冲区,则返回 false。因此,调用者知道它必须再次调用flush,直到所有数据都写入EndPoint。

查看 WriteFlusher.write() 和 WriteFlusher.completeWrite() 并阅读那里的 javadocs 以了解它的使用方式。

关于这一行:flushed|=super.flush(b); // <<-- 不应该是 &=

我想你是对的。flushed 被初始化为 true ,因此将始终为 true 。我会仔细检查并可能修复它。

于 2013-07-03T15:52:31.130 回答