TCP粘拆包详解与Netty代码示例( 二 )


public class SocketDecoder extends ByteToMessageDecoder { @Override void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception { int bufLen = byteBuf.readableBytes(); // 解决粘包问题(不够一个包头的长度) // 4字节是报文中使用了一个int表示了报文长度 if (bufLen < 4) { return; } // 标记一下当前的readIndex的位置 byteBuf.markReaderIndex(); int packetLength = byteBuf.readInt(); // 读到的消息体长度如果小于我们传送过来的消息长度,则resetReaderIndex 。重置读索引,继续接收 if (byteBuf.readableBytes() < packetLength) { // 配合markReaderIndex使用的 。把readIndex重置到mark的地方 byteBuf.resetReaderIndex(); return; } NetPacket netPacket = new NetPacket(); netPacket.setPacketLen(packetLength); // 传送过来数据的长度,满足我们的要求了 byte body[] = new byte[packetLength]; byteBuf.readBytes(body); netPacket.setBody(body); list.add(netPacket); }}更多内容,欢迎关注微信公众号:全菜工程师小辉~




推荐阅读