標籤:java
tcp粘包拆包解決方案
1.發送定長的訊息
server端:
EventLoopGroup pGroup = new NioEventLoopGroup();EventLoopGroup cGroup = new NioEventLoopGroup();ServerBootstrap b = new ServerBootstrap();b.group(pGroup, cGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel sc) throws Exception {//設定定長字串接收sc.pipeline().addLast(new FixedLengthFrameDecoder(5));//設定字串形式的解碼sc.pipeline().addLast(new StringDecoder());sc.pipeline().addLast(new ServerHandler());}});ChannelFuture cf = b.bind(8765).sync();cf.channel().closeFuture().sync();pGroup.shutdownGracefully();cGroup.shutdownGracefully();
client:
EventLoopGroup group = new NioEventLoopGroup();Bootstrap b = new Bootstrap();b.group(group) .channel(NioSocketChannel.class) .handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel sc) throws Exception {sc.pipeline().addLast(new FixedLengthFrameDecoder(5));sc.pipeline().addLast(new StringDecoder());sc.pipeline().addLast(new ClientHandler());}});ChannelFuture cf = b.connect("127.0.0.1", 8765).sync();cf.channel().writeAndFlush(Unpooled.wrappedBuffer("111111112222222".getBytes()));cf.channel().writeAndFlush(Unpooled.copiedBuffer("3333333".getBytes()));cf.channel().closeFuture().sync();group.shutdownGracefully();
2.採用特殊分割符來進行分割
server端:
EventLoopGroup pGroup = new NioEventLoopGroup();EventLoopGroup cGroup = new NioEventLoopGroup();ServerBootstrap b = new ServerBootstrap();b.group(pGroup, cGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 1024) .option(ChannelOption.SO_SNDBUF, 32*1024) .option(ChannelOption.SO_RCVBUF, 32*1024) .childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel sc) throws Exception {//設定特殊分隔字元ByteBuf buf = Unpooled.copiedBuffer("$_".getBytes());sc.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, buf));//設定字串形式的解碼sc.pipeline().addLast(new StringDecoder());sc.pipeline().addLast(new ServerHandler());}});ChannelFuture cf = b.bind(8765).sync();cf.channel().closeFuture().sync();pGroup.shutdownGracefully();cGroup.shutdownGracefully();
client:
EventLoopGroup group = new NioEventLoopGroup();Bootstrap b = new Bootstrap();b.group(group) .channel(NioSocketChannel.class) .handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel sc) throws Exception {//$_作為分割符號ByteBuf buf = Unpooled.copiedBuffer("$_".getBytes());sc.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, buf));sc.pipeline().addLast(new StringDecoder());sc.pipeline().addLast(new ClientHandler());}});ChannelFuture cf = b.connect("127.0.0.1", 8765).sync();cf.channel().writeAndFlush(Unpooled.wrappedBuffer("111111111$_".getBytes()));cf.channel().writeAndFlush(Unpooled.wrappedBuffer("222$_".getBytes()));//等待用戶端連接埠關閉cf.channel().closeFuture().sync();group.shutdownGracefully();
採用自訂協議方式
netty解決tcp粘包拆包問題