我写了一个基于netty 4的REST服务器。客户端处理程序如下所示。

netty提供的msg中的字节缓冲区容量有所不同。当客户端消息大于缓冲区时,消息将被拆分。我发现,每个片段都会调用channelRead和ChannelReadComplete。我通常看到的是ByteBuf大约为512,消息大约为600。我得到前512个字节的channelRead,然后是它们的ChannelReadComplete,然后是剩下的100个字节的另一个channelRead和一个它们的channelReadComplete- 2条消息,而不是1条消息。

我在这里找到了一些相关的问题,但是我想知道channelReadComplete的意义是什么?在每个channelRead之后是否真的调用了它?只要有字节可用,是否不应该在调用channelReadComplete之前读取它们?

public class ClientHandler extends ChannelInboundHandlerAdapter {
    ....
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        Report.debug("Read from client");
        ByteBuf buf = (ByteBuf) msg;
        String contents = buf.toString(io.netty.util.CharsetUtil.US_ASCII);
        ReferenceCountUtil.release(msg);

        ClientConnection client = ClientConnection.get(ctx);
        if (client != null) {
            client.messageText(contents);   // adds text to buffer
            return;
        }
        ((parse serial number from contents, process registration))
        ClientConnection.online(serialNumber, ctx);     // register success, create the client object
    }

    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ClientConnection client = ClientConnection.get(ctx);
        if (client == null)
            Report.debug("completed read of message from unregistered client");
        else {
            Report.debug("completed read of message from client " + client.serialNumber());
            String contents = client.messageText();
            ... ((process message))
        }
    }
 }

最佳答案

在每次channelRead之后都不会调用channelReadComplete。 netty事件循环将从NIO套接字读取并触发多个channelRead,直到没有更多数据要读取或应该放弃为止,然后触发channelReadComplete。

09-12 19:02