物联网 基于netty编解码器机制与自定义协议

物联网 基于netty编解码器机制与自定义协议

编解码器

Netty 中网络传输的数据本质是 字节(ByteBuf),而业务逻辑通常操作 对象(如 POJO、字符串、JSON)

复制代码
编码器(Encoder):将业务对象 → 字节,以便写出到网络
解码器(Decoder):将字节 → 业务对象,以便业务 Handler 处理
TCP 流式特性带来的粘包/拆包问题,必须在 解码阶段 解决
Netty 提供了丰富的解码器基类,其中最重要的就是 ByteToMessageDecoder

源码(netty-sample-00-codec)

https://gitee.com/kcnf-iot/iot-sample/tree/master/netty/netty-sample-00

核心编解码器类层次

抽象类 作用
ByteToMessageDecoder 将入站字节解码为多个对象(可解决粘包/拆包)。需要实现 decode() 方法,将累积的字节解码成业务对象并放入
MessageToByteEncoder 将出站对象编码为字节。实现 encode() 方法。
ReplayingDecoder ByteToMessageDecoder 的子类,它通过状态机简化了解码逻辑,但性能略低(使用方便的断言方式)。
MessageToMessageDecoder 将一种消息类型解码为另一种(如 JSON 字符串 → POJO)。

协议格式

复制代码
+----------+----------------+
| 长度(4B) |   数据(变长)    |
+----------+----------------+

代码

server 端
复制代码
package com.jysemel.iot;

import com.jysemel.iot.code.CustomProtocolDecoder;
import com.jysemel.iot.code.CustomProtocolEncoder;
import com.jysemel.iot.handler.ServerBusinessHandler;
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 CustomProtocolServer {
    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 pipeline = ch.pipeline();
                            // 添加自定义解码器(解决粘包/拆包)
                            pipeline.addLast(new CustomProtocolDecoder());
                            // 添加自定义编码器(用于回显)
                            pipeline.addLast(new CustomProtocolEncoder());
                            // 业务 Handler
                            pipeline.addLast(new ServerBusinessHandler());
                        }
                    });
            ChannelFuture future = bootstrap.bind(8182).sync();
            System.out.println("自定义协议服务器启动,端口 8182");
            future.channel().closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}
client 端
复制代码
package com.jysemel.iot;

import com.jysemel.iot.code.CustomProtocolDecoder;
import com.jysemel.iot.code.CustomProtocolEncoder;
import com.jysemel.iot.handler.ClientBusinessHandler;
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 CustomProtocolClient {

    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 pipeline = ch.pipeline();
                            pipeline.addLast(new CustomProtocolDecoder());
                            pipeline.addLast(new CustomProtocolEncoder());
                            pipeline.addLast(new ClientBusinessHandler());
                        }
                    });
            ChannelFuture future = bootstrap.connect("127.0.0.1", 8182).sync();
            future.channel().closeFuture().sync();
        } finally {
            group.shutdownGracefully();
        }
    }
}
相关推荐
2501_913981782 小时前
2026年智能仪表物联网发展趋势:技术创新、通信方案与选型指南
物联网·智能仪表
博纬智能RFID3 小时前
RFID读写器与标签在工业产线中的深度应用
物联网
DolphinDB4 小时前
从自主可控到安全可靠:DolphinDB 如何成为物联网企业的数据底座选择
物联网·时序数据库·dolphindb
智圣新创016 小时前
存量数字化校园效能升级:智圣新创数据治理及一表通平台实现填报减负与数据价值双升
大数据·人工智能·物联网
yyxx4121237 小时前
钉钉专属版一年多少钱?2026最新价格
大数据·人工智能·物联网
做萤石二次开发的哈哈10 小时前
海康便携球接入萤石蓝海AIoT一站式工作台:移动执法多端应用一站生成
物联网·海康威视·车牌识别·萤石开放平台·蓝海aiot一站式工作台·aiot开发·移动执法
华允物联-HUAIOT10 小时前
DTU真的不重要吗?工业路由器为何更胜一筹?
物联网·智能路由器·4g
数字新视界10 小时前
机房环境监测系统的架构优化与智能应用剖析
物联网·数据中心·动环监控·微模块机房·模块化机房
Oflycomm17 小时前
智能网联汽车渗透率攀升至38.4%,Wi-Fi 7 + 蓝牙6.0如何重塑车载无线连接?
物联网·plc·车联网·wifi7·智能网联汽车·蓝牙6.0
乐橙开放平台1 天前
养老 SaaS 笔记:setMessageCallback 事件桥接 + msgType 映射 P0/P1,先 ACK 再分流值班流
笔记·物联网·音视频·智能家居