利用LineBasedFrameDecoder解决TCP粘包问题

1:TimeServer类

 

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.LineBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;

public class TimeServer {

    public void bind(int port) throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup, workerGroup)
                           .channel(NioServerSocketChannel.class)
                           .option(ChannelOption.SO_BACKLOG, 1024)
                           .childHandler(new ChildChannelHandler());
            //绑定端口,同步等待成功
            ChannelFuture future = serverBootstrap.bind(port).sync();
            //等待服务端监听端口关闭
            future.channel().closeFuture().sync();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //优雅退出
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }

    private class ChildChannelHandler extends ChannelInitializer<SocketChannel> {
        @Override
        protected void initChannel(SocketChannel socketChannel) throws Exception {
            socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024));
            socketChannel.pipeline().addLast(new StringDecoder());
            socketChannel.pipeline().addLast(new TimeServerHandler());
        }
    }

    public static void main(String[] args) throws Exception {
        int port = 8080;
        if (args != null && args.length > 0) {
            try {
                port = Integer.parseInt(args[0]);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        new TimeServer().bind(port);
    }

}

 

 

 

 

 

2:TimeServerHandler

 

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TimeServerHandler extends ChannelInboundHandlerAdapter {

    private int counter = 0;

    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        String body = (String)msg;
        System.out.println("The time server receive order : " + body + "; the counter is " + (++this.counter));

        String currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body) ? new Date(System.currentTimeMillis()).toString() : "BAD ORDER";

        currentTime += System.getProperty("line.separator");

        ByteBuf resp = Unpooled.copiedBuffer(currentTime.getBytes());
        ctx.writeAndFlush(resp);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        super.exceptionCaught(ctx, cause);
    }
}

 

 

 

3:TimeClient

 

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.LineBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;

public class TimeClient {

    public void connect(int port, String host) throws Exception {
        //配置客户端NIO线程组
        EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
        try {
            Bootstrap bootstrap = new Bootstrap();

            bootstrap.group(eventLoopGroup)
                    .channel(NioSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG, 1024)
                    .handler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
                            socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024));
                            socketChannel.pipeline().addLast(new StringDecoder());
                            socketChannel.pipeline().addLast(new TimeClientHandler());
                        }
                    });

            //发起异步链接操作
            ChannelFuture channelFuture = bootstrap.connect(host, port).sync();

            //等待客户端链路关闭
            channelFuture.channel().closeFuture().sync();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //优雅退出,释放NIO线程组
            eventLoopGroup.shutdownGracefully();
        }
    }

    public static void main(String[] args) throws Exception {
        int port = 8080;
        if (args != null && args.length > 0) {
            try {
                port = Integer.parseInt(args[0]);
            } catch (Exception e) {  //采用默认值
                e.printStackTrace();
            }
        }

        new TimeClient().connect(port, "127.0.0.1");
    }

}

 

 

 

4:TimeClientHandler

 

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

public class TimeClientHandler extends ChannelInboundHandlerAdapter {

    private int counter = 0;

    private byte[] req;

    public TimeClientHandler() {
        req = ("QUERY TIME ORDER" + System.getProperty("line.separator")).getBytes();
    }

    public void channelActive(ChannelHandlerContext ctx) {
        ByteBuf message = null;
        for (int i = 0; i < 100; i++) {
            message = Unpooled.buffer(req.length);
            message.writeBytes(req);
            ctx.writeAndFlush(message);
        }
    }

    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        String body = (String)msg;
        System.out.println("Now is " + body + "; the counter is " + (++this.counter));
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        super.exceptionCaught(ctx, cause);
    }
}

 

 

5:测试结果

TimeServer端:

The time server receive order : QUERY TIME ORDER; the counter is 1
The time server receive order : QUERY TIME ORDER; the counter is 2
The time server receive order : QUERY TIME ORDER; the counter is 3
The time server receive order : QUERY TIME ORDER; the counter is 4
The time server receive order : QUERY TIME ORDER; the counter is 5
The time server receive order : QUERY TIME ORDER; the counter is 6
The time server receive order : QUERY TIME ORDER; the counter is 7
The time server receive order : QUERY TIME ORDER; the counter is 8
The time server receive order : QUERY TIME ORDER; the counter is 9
The time server receive order : QUERY TIME ORDER; the counter is 10
The time server receive order : QUERY TIME ORDER; the counter is 11
The time server receive order : QUERY TIME ORDER; the counter is 12
The time server receive order : QUERY TIME ORDER; the counter is 13
The time server receive order : QUERY TIME ORDER; the counter is 14
The time server receive order : QUERY TIME ORDER; the counter is 15
The time server receive order : QUERY TIME ORDER; the counter is 16
The time server receive order : QUERY TIME ORDER; the counter is 17
The time server receive order : QUERY TIME ORDER; the counter is 18
The time server receive order : QUERY TIME ORDER; the counter is 19
The time server receive order : QUERY TIME ORDER; the counter is 20
The time server receive order : QUERY TIME ORDER; the counter is 21
The time server receive order : QUERY TIME ORDER; the counter is 22
The time server receive order : QUERY TIME ORDER; the counter is 23
The time server receive order : QUERY TIME ORDER; the counter is 24
The time server receive order : QUERY TIME ORDER; the counter is 25
The time server receive order : QUERY TIME ORDER; the counter is 26
The time server receive order : QUERY TIME ORDER; the counter is 27
The time server receive order : QUERY TIME ORDER; the counter is 28
The time server receive order : QUERY TIME ORDER; the counter is 29
The time server receive order : QUERY TIME ORDER; the counter is 30
The time server receive order : QUERY TIME ORDER; the counter is 31
The time server receive order : QUERY TIME ORDER; the counter is 32
The time server receive order : QUERY TIME ORDER; the counter is 33
The time server receive order : QUERY TIME ORDER; the counter is 34
The time server receive order : QUERY TIME ORDER; the counter is 35
The time server receive order : QUERY TIME ORDER; the counter is 36
The time server receive order : QUERY TIME ORDER; the counter is 37
The time server receive order : QUERY TIME ORDER; the counter is 38
The time server receive order : QUERY TIME ORDER; the counter is 39
The time server receive order : QUERY TIME ORDER; the counter is 40
The time server receive order : QUERY TIME ORDER; the counter is 41
The time server receive order : QUERY TIME ORDER; the counter is 42
The time server receive order : QUERY TIME ORDER; the counter is 43
The time server receive order : QUERY TIME ORDER; the counter is 44
The time server receive order : QUERY TIME ORDER; the counter is 45
The time server receive order : QUERY TIME ORDER; the counter is 46
The time server receive order : QUERY TIME ORDER; the counter is 47
The time server receive order : QUERY TIME ORDER; the counter is 48
The time server receive order : QUERY TIME ORDER; the counter is 49
The time server receive order : QUERY TIME ORDER; the counter is 50
The time server receive order : QUERY TIME ORDER; the counter is 51
The time server receive order : QUERY TIME ORDER; the counter is 52
The time server receive order : QUERY TIME ORDER; the counter is 53
The time server receive order : QUERY TIME ORDER; the counter is 54
The time server receive order : QUERY TIME ORDER; the counter is 55
The time server receive order : QUERY TIME ORDER; the counter is 56
The time server receive order : QUERY TIME ORDER; the counter is 57
The time server receive order : QUERY TIME ORDER; the counter is 58
The time server receive order : QUERY TIME ORDER; the counter is 59
The time server receive order : QUERY TIME ORDER; the counter is 60
The time server receive order : QUERY TIME ORDER; the counter is 61
The time server receive order : QUERY TIME ORDER; the counter is 62
The time server receive order : QUERY TIME ORDER; the counter is 63
The time server receive order : QUERY TIME ORDER; the counter is 64
The time server receive order : QUERY TIME ORDER; the counter is 65
The time server receive order : QUERY TIME ORDER; the counter is 66
The time server receive order : QUERY TIME ORDER; the counter is 67
The time server receive order : QUERY TIME ORDER; the counter is 68
The time server receive order : QUERY TIME ORDER; the counter is 69
The time server receive order : QUERY TIME ORDER; the counter is 70
The time server receive order : QUERY TIME ORDER; the counter is 71
The time server receive order : QUERY TIME ORDER; the counter is 72
The time server receive order : QUERY TIME ORDER; the counter is 73
The time server receive order : QUERY TIME ORDER; the counter is 74
The time server receive order : QUERY TIME ORDER; the counter is 75
The time server receive order : QUERY TIME ORDER; the counter is 76
The time server receive order : QUERY TIME ORDER; the counter is 77
The time server receive order : QUERY TIME ORDER; the counter is 78
The time server receive order : QUERY TIME ORDER; the counter is 79
The time server receive order : QUERY TIME ORDER; the counter is 80
The time server receive order : QUERY TIME ORDER; the counter is 81
The time server receive order : QUERY TIME ORDER; the counter is 82
The time server receive order : QUERY TIME ORDER; the counter is 83
The time server receive order : QUERY TIME ORDER; the counter is 84
The time server receive order : QUERY TIME ORDER; the counter is 85
The time server receive order : QUERY TIME ORDER; the counter is 86
The time server receive order : QUERY TIME ORDER; the counter is 87
The time server receive order : QUERY TIME ORDER; the counter is 88
The time server receive order : QUERY TIME ORDER; the counter is 89
The time server receive order : QUERY TIME ORDER; the counter is 90
The time server receive order : QUERY TIME ORDER; the counter is 91
The time server receive order : QUERY TIME ORDER; the counter is 92
The time server receive order : QUERY TIME ORDER; the counter is 93
The time server receive order : QUERY TIME ORDER; the counter is 94
The time server receive order : QUERY TIME ORDER; the counter is 95
The time server receive order : QUERY TIME ORDER; the counter is 96
The time server receive order : QUERY TIME ORDER; the counter is 97
The time server receive order : QUERY TIME ORDER; the counter is 98
The time server receive order : QUERY TIME ORDER; the counter is 99
The time server receive order : QUERY TIME ORDER; the counter is 100

 

TimeClient端:

Now is Mon Jul 10 00:55:19 CST 2017; the counter is 1
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 2
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 3
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 4
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 5
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 6
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 7
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 8
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 9
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 10
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 11
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 12
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 13
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 14
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 15
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 16
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 17
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 18
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 19
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 20
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 21
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 22
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 23
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 24
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 25
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 26
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 27
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 28
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 29
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 30
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 31
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 32
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 33
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 34
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 35
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 36
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 37
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 38
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 39
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 40
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 41
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 42
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 43
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 44
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 45
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 46
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 47
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 48
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 49
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 50
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 51
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 52
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 53
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 54
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 55
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 56
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 57
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 58
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 59
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 60
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 61
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 62
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 63
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 64
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 65
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 66
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 67
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 68
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 69
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 70
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 71
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 72
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 73
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 74
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 75
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 76
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 77
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 78
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 79
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 80
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 81
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 82
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 83
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 84
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 85
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 86
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 87
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 88
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 89
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 90
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 91
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 92
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 93
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 94
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 95
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 96
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 97
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 98
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 99
Now is Mon Jul 10 00:55:19 CST 2017; the counter is 100

 

越努力,越幸运,欢迎关注我的个人技术公众号

深耕java领域,技术专家,CSDN博客专家,联系我请去 微信公众号:波哥的技术积累,回复“资料”,会有意外惊喜,包含面试题,系统架构图,并发包源码分析等资料,而且波哥老师的视频教程【Java并发包源码分析(JDK1.8)】即将免费,https://edu.csdn.net/course/detail/22039,大家有对JUC源码感兴趣的,可以去学习,有问题微信联系,会及时解答!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

波哥的技术积累

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值