物联网 基于netty构建mqtt协议规范(轻量级二进制协议)简述在物联网、游戏服务器、RPC 等场景中需要高效的网络通信。 二进制协议相比 JSON/XML 等文本协议具有更小的体积、更快的解析速度、更低的内存占用等优势。 设计一个简单的二进制协议并基于 Netty 实现完整的编解码器深入理解二进制协议的开发流程源码(netty-sample-03-Binary)https://gitee.com/kcnf-iot/iot-sample/tree/master/netty/netty-sample-03协议设计类 MQTT 风格 的轻量级二进制协议字段字节数描述魔数 (Magic)1固定为0xAA用于快速校验和过滤非法连接消息类型 (Type)11请求2响应3心跳消息ID (MsgId)4大端序整数用于请求-响应关联数据长度 (Length)2无符号短整型最大 65535表示后面数据字段的字节数数据 (Data)Length二进制数据例如 UTF-8 字符串或其他内容协议总长度1142Length 8Length 字节优点魔数帮助快速判断连接是否为合法客户端 长度字段为 2 字节可表示最大 64KB 的消息体适合小型物联网设备 消息 ID 使我们可以实现请求-响应的异步模型如 RPC为什么二进制协议更轻量特性文本协议 (JSON)二进制协议数字编码123占用3字节0x7B占用1字节布尔值true占用4字节1位或1字节字段名每次重复发送靠偏移量隐式约定解析开销字符串扫描、递归下降按位移位、直接取值示例{id:1}8字节若协议仅发送 id 数值只需 4 字节二进制 intserver代码package com.jysemel.iot.pojo; import com.jysemel.iot.pojo.coder.BinaryMessageDecoder; import com.jysemel.iot.pojo.coder.BinaryMessageEncoder; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; public class BinaryProtocolServer { public static void main(String[] args) throws InterruptedException { EventLoopGroup bossGroup new NioEventLoopGroup(1); EventLoopGroup workerGroup new NioEventLoopGroup(); try { ServerBootstrap bootstrap new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializerSocketChannel() { Override protected void initChannel(SocketChannel ch) { ChannelPipeline p ch.pipeline(); // 添加二进制解码器和编码器 p.addLast(new BinaryMessageDecoder()); p.addLast(new BinaryMessageEncoder()); p.addLast(new ServerBusinessHandler()); } }); ChannelFuture future bootstrap.bind(8088).sync(); System.out.println(二进制协议服务器启动端口 8088); future.channel().closeFuture().sync(); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } }client代码package com.jysemel.iot.pojo; import com.jysemel.iot.pojo.coder.BinaryMessageDecoder; import com.jysemel.iot.pojo.coder.BinaryMessageEncoder; import io.netty.bootstrap.Bootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; public class BinaryProtocolClient { public static void main(String[] args) throws InterruptedException { EventLoopGroup group new NioEventLoopGroup(); try { Bootstrap bootstrap new Bootstrap(); bootstrap.group(group) .channel(NioSocketChannel.class) .handler(new ChannelInitializerSocketChannel() { Override protected void initChannel(SocketChannel ch) { ChannelPipeline p ch.pipeline(); p.addLast(new BinaryMessageDecoder()); p.addLast(new BinaryMessageEncoder()); p.addLast(new ClientBusinessHandler()); } }); ChannelFuture future bootstrap.connect(127.0.0.1, 8088).sync(); future.channel().closeFuture().sync(); } finally { group.shutdownGracefully(); } } }验证结果
物联网 基于netty构建mqtt协议规范(轻量级二进制协议)
发布时间:2026/5/21 0:21:16
物联网 基于netty构建mqtt协议规范(轻量级二进制协议)简述在物联网、游戏服务器、RPC 等场景中需要高效的网络通信。 二进制协议相比 JSON/XML 等文本协议具有更小的体积、更快的解析速度、更低的内存占用等优势。 设计一个简单的二进制协议并基于 Netty 实现完整的编解码器深入理解二进制协议的开发流程源码(netty-sample-03-Binary)https://gitee.com/kcnf-iot/iot-sample/tree/master/netty/netty-sample-03协议设计类 MQTT 风格 的轻量级二进制协议字段字节数描述魔数 (Magic)1固定为0xAA用于快速校验和过滤非法连接消息类型 (Type)11请求2响应3心跳消息ID (MsgId)4大端序整数用于请求-响应关联数据长度 (Length)2无符号短整型最大 65535表示后面数据字段的字节数数据 (Data)Length二进制数据例如 UTF-8 字符串或其他内容协议总长度1142Length 8Length 字节优点魔数帮助快速判断连接是否为合法客户端 长度字段为 2 字节可表示最大 64KB 的消息体适合小型物联网设备 消息 ID 使我们可以实现请求-响应的异步模型如 RPC为什么二进制协议更轻量特性文本协议 (JSON)二进制协议数字编码123占用3字节0x7B占用1字节布尔值true占用4字节1位或1字节字段名每次重复发送靠偏移量隐式约定解析开销字符串扫描、递归下降按位移位、直接取值示例{id:1}8字节若协议仅发送 id 数值只需 4 字节二进制 intserver代码package com.jysemel.iot.pojo; import com.jysemel.iot.pojo.coder.BinaryMessageDecoder; import com.jysemel.iot.pojo.coder.BinaryMessageEncoder; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; public class BinaryProtocolServer { public static void main(String[] args) throws InterruptedException { EventLoopGroup bossGroup new NioEventLoopGroup(1); EventLoopGroup workerGroup new NioEventLoopGroup(); try { ServerBootstrap bootstrap new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializerSocketChannel() { Override protected void initChannel(SocketChannel ch) { ChannelPipeline p ch.pipeline(); // 添加二进制解码器和编码器 p.addLast(new BinaryMessageDecoder()); p.addLast(new BinaryMessageEncoder()); p.addLast(new ServerBusinessHandler()); } }); ChannelFuture future bootstrap.bind(8088).sync(); System.out.println(二进制协议服务器启动端口 8088); future.channel().closeFuture().sync(); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } }client代码package com.jysemel.iot.pojo; import com.jysemel.iot.pojo.coder.BinaryMessageDecoder; import com.jysemel.iot.pojo.coder.BinaryMessageEncoder; import io.netty.bootstrap.Bootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; public class BinaryProtocolClient { public static void main(String[] args) throws InterruptedException { EventLoopGroup group new NioEventLoopGroup(); try { Bootstrap bootstrap new Bootstrap(); bootstrap.group(group) .channel(NioSocketChannel.class) .handler(new ChannelInitializerSocketChannel() { Override protected void initChannel(SocketChannel ch) { ChannelPipeline p ch.pipeline(); p.addLast(new BinaryMessageDecoder()); p.addLast(new BinaryMessageEncoder()); p.addLast(new ClientBusinessHandler()); } }); ChannelFuture future bootstrap.connect(127.0.0.1, 8088).sync(); future.channel().closeFuture().sync(); } finally { group.shutdownGracefully(); } } }验证结果