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 次分别使用 1
、2
和 3
,但实际上是 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 文档中有更多详细信息。
这是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 次分别使用 1
、2
和 3
,但实际上是 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 文档中有更多详细信息。