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); }}更多内容,欢迎关注微信公众号:全菜工程师小辉~
推荐阅读
- 「一图详解」收藏!一份关于小规模纳税人减征增值税的学习笔记
- 详解MySQL兼容性show_compatibility_56参数
- 详解Https是如何确保安全的
- 详解ORACLE数据字典--V$SQL_WORKAREA_ACTIVE
- 详解汽车散热系统,夏天拒绝发动机高温
- 详解唐诗中的那些茶文化
- 地下室防水施工步骤详解
- 图文详解HDFS工作机制
- MIUI12桌面设置详解,新手必会的八项小技巧
- linux下.tar.gz和.gz文件解压详解