物联网 基于netty构建mqtt协议规范(轻量级二进制协议)

物联网 基于netty构建mqtt协议规范(轻量级二进制协议)

简述

在物联网、游戏服务器、RPC 等场景中,需要高效的网络通信。 二进制协议相比 JSON/XML 等文本协议,具有更小的体积、更快的解析速度、更低的内存占用等优势。 设计一个简单的二进制协议,并基于 Netty 实现完整的编解码器,深入理解二进制协议的开发流程

源码(netty-sample-03-Binary)

gitee.com/kcnf-iot/io...

协议设计

类 MQTT 风格 的轻量级二进制协议

字段

字节数

描述

魔数 (Magic)

1

固定为 0xAA,用于快速校验和过滤非法连接

消息类型 (Type)

1

1=请求,2=响应,3=心跳

消息ID (MsgId)

4

大端序整数,用于请求-响应关联

数据长度 (Length)

2

无符号短整型(最大 65535),表示后面数据字段的字节数

数据 (Data)

Length

二进制数据(例如 UTF-8 字符串或其他内容)

协议总长度:1+1+4+2+Length = 8+Length 字节

优点

复制代码
魔数帮助快速判断连接是否为合法客户端
长度字段为 2 字节,可表示最大 64KB 的消息体,适合小型物联网设备
消息 ID 使我们可以实现请求-响应的异步模型(如 RPC)

为什么二进制协议更轻量

特性

文本协议 (JSON)

二进制协议

数字编码

"123" 占用3字节

0x7B 占用1字节

布尔值

"true" 占用4字节

1位或1字节

字段名

每次重复发送

靠偏移量隐式约定

解析开销

字符串扫描、递归下降

按位移位、直接取值

示例:{"id":1}

8字节

若协议仅发送 id 数值,只需 4 字节(二进制 int)

server代码

java 复制代码
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 ChannelInitializer<SocketChannel>() {
                        @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代码

java 复制代码
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 ChannelInitializer<SocketChannel>() {
                        @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();
        }
    }
}

验证结果

相关推荐
晨曦中的暮雨10 小时前
Golang速通(Javaer版)
java·开发语言·后端·golang
小村儿11 小时前
连载13- 内部Tools,Claude Code 怎么真正"动"你的代码
前端·后端·ai编程
IT_陈寒11 小时前
Python的线程池把我坑惨了,原来异步不是万能的
前端·人工智能·后端
郑洁文11 小时前
基于SpringBoot的商品仓库管理系统的设计与实现
java·spring boot·后端·仓库管理系统·商品仓库管理系统
该用户已不存在12 小时前
这9款开发工具夯爆了,用了都说好
后端·程序员·全栈
KeepPush12 小时前
Python迭代器与生成器:从原理到实战的深度解析
后端
KeepPush12 小时前
Python itertools 深度指南:用迭代器代数写出更高效的代码
后端
小蜜蜂dry13 小时前
nestjs实战-权限二:角色模块
前端·后端·nestjs
默默且听风13 小时前
Ubuntu 22 环境下 VS Code Codex 插件无法打开的排查与修复记录
后端·ai编程·vibecoding
小蜜蜂dry13 小时前
nestjs实战-权限一: 菜单模块
前端·后端·nestjs