Netty对处理粘包和半包的支持

Netty基本介绍,参考 Netty与网络编程

1.1 什么是粘包拆包

例如:发送 ABC, DEF两个报文

  • 收到ABCDEF一个报文,发生了粘包

  • 收到AB,C,DEF三个报文,ABC发生了拆包

  • 收到AB,CD,EF三个报文,即发生了拆包又发生了粘包

1.2 看一个粘包半包样例

  • 客户端每次把消息“ABC,DEF,GHI,JKL,MNO\n" 发生一百次给服务端
  • 服务端将每次收到的消息输出,并记录收到的次数,然后将消息返回客户端

我们看下面服务端输出的结果:

  • 服务端一共接收到两次消息,说明消息被合并了,发生了粘包
  • 第一次输出的消息最后一行只有"ABC,",这说明发生了拆包,一个完整的消息被拆分了才会出现这种情况

输出结果:

Server Accept[ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,] and the counter is:1
Server Accept[DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
ABC,DEF,GHI,JKL,MNO
] and the counter is:2

代码:

EchoClient.java

public class EchoClient {
   

    private final int port;
    private final String host;

    public EchoClient(int port, String host) {
   
        this.port = port;
        this.host = host;
    }

    public void start() throws InterruptedException {
   
        EventLoopGroup group = new NioEventLoopGroup();/*线程组*/
        try {
   
            final Bootstrap b = new Bootstrap();;/*客户端启动必须*/
            b.group(group)/*将线程组传入*/
                    .channel(NioSocketChannel.class)/*指定使用NIO进行网络传输*/
                    .remoteAddress(new InetSocketAddress(host,port))/*配置要连接服务器的ip地址和端口*/
                    .handler(new ChannelInitializer<SocketChannel>()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值