Netty:为什么不同的数据包在服务器中作为请求连接在一起?

Netty: Why different packets are connected together as an request in the server?

这是Netty客户端中唯一的处理程序,我向服务器发送了3个数据包。

@Sharable
public class ClientHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        ctx.writeAndFlush(Unpooled.copiedBuffer("1", CharsetUtil.UTF_8));
        ctx.writeAndFlush(Unpooled.copiedBuffer("2", CharsetUtil.UTF_8));
        ctx.writeAndFlush(Unpooled.copiedBuffer("3", CharsetUtil.UTF_8))
                .addListener(ChannelFutureListener.CLOSE);
    }
}

在服务器处理程序中,我只打印了它,预期 3 次分别使用 123,但实际上是 123。发生了什么?它们不是不同的数据包吗?

@Sharable
public class ServerHandler extends SimpleChannelInboundHandler<ByteBuf> {
    @Override
    public void channelRead0(ChannelHandlerContext ctx, ByteBuf in) {
        System.out.println(in.toString(CharsetUtil.UTF_8));
    }
}

TCP/IP 协议(您可能在服务器中使用的)是 stream-based。这意味着 stream-based 传输的缓冲区不是数据包队列,而​​是字节队列。因此,如何发送您的数据取决于 OS - 作为单独的数据包还是作为包含所有数据的 1 个数据包。

您有 3 个选项,要么添加一些分隔符,要么发送固定长度的数据包,要么将数据包大小附加到消息中。

Here is netty 文档中有更多详细信息。