本文来自阿钟的投稿,阅读大约8分钟
一、什么粘包呢?
简单来说就是:发送的多个包被粘到了一块变成了一个包。
比如说:服务端连续发送了两个包客户端确只收到了一条包(这一个包里其实就是两个数据包),正常来说客户端也应该收到两个包。这就是所谓的粘包 客户端遇到这种情况就需要做拆包处理了。
二、一般处理粘包的手段
使用固定长度的数据
使用特殊字符分割($、\n….)
其他
Netty也为我们提供了几个处理粘包的解码器,如下:
DelimiterBasedFrameDecoder
基于特殊字符进行粘包拆包处理FixedLengthFrameDecoder
基于固定长度进行粘包拆包处理LengthFieldBasedFrameDecoder
基于消息头指定消息长度进行粘包拆包处理LineBasedFrameDecoder
基于换行符( \r\n,\n)进行粘包拆包处理
三、下面通过一个示例来处理粘包拆包,这里我使用`DelimiterBasedFrameDecoder` 这个解码器然后使用`$`作为特殊分隔符
3.1 首先给服务端添加`DelimiterBasedFrameDecoder`
1/**
2 * 启动tcp服务端
3 */
4public void startServer() {
5 try {
6 EventLoopGroup bossGroup = new NioEventLoopGroup();
7 EventLoopGroup workerGroup = new NioEventLoopGroup();
8 ServerBootstrap b = new ServerBootstrap();
9 b.group(bossGroup, workerGroup)
10 .channel(NioServerSocketChannel.class)
11 .childHandler(new ChannelInitializer<SocketChannel>() {
12 //分隔符
13 ByteBuf delimiter = Un