本文是使用Netty开发一个简单的TCP通讯(聊天)应用程序的第【1】部分,主要介绍编解码实现。
定制协议
一般来说,开发TCP通讯应用程序,定制通讯协议是不可避免的,这里以一种最简单的协议为例,假设一个TCP通讯数据包,包含三部分:
[type][size][content]
- type:数据包类型(长度为一个字节,即1个byte)
- size:数据包长度(长度为四个字节,即4个byte)
- content:实际的数据包内容
Java数据包结构封装:
/** * @author michong */ public class Packet { /** * 消息类型 */ private byte type; /** * 内容长度(不含size和type长度) */ private int size; /** * 消息内容 */ private byte[] content; }
数据编码
使用Netty进行数据包编码可以通过继承MessageToByteEncoder
来实现:
/** * @author michong */ public class PacketEncoder extends MessageToByteEncoder<Packet> { @Override protected void encode(ChannelHandlerContext ctx, Packet packet, ByteBuf out) { if (Objects.isNull(packet) { return; } out.writeByte(packet.getType()); out.writeIntLE(packet.getSize()); out.writeBytes(packet.getContent()); } }
需要注意的是:这里需要按定制协议的顺序写出,这里的size使用的是小端模式,解码的时候也要使用小端模式。
数据解码
使用Netty进行数据包编码可以通过继承ReplayingDecoder
来实现:
/** * @author michong */ public class PacketDecoder extends ReplayingDecoder<Void> { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) { byte type = in.readByte(); int size = in.readIntLE(); byte[] content = new byte[size]; in.readBytes(content); Packet pkt = new Packet(type, content); out.add(pkt); } }
这里可以很明显的感受到使用Netty开发的好处,使用Netty开发可以不用自己处理粘包、半包问题,解码这里使用的是跟编码一样的小端模式。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库