Netty实战应用学习笔记-中级拓展篇(十)

「深入浅出Netty」不愧是阿里架构师,这篇Netty实战文档太实用 前言 什么是Netty? Netty是由JBOSS提供的一个java开源框架。 Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty是一个基于NIO的客户,服务器端编程框架,使用Netty可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。 作为当前最流行的NIO框架,Netty在互联... 阅读详情

🎨 项目十:多种协议消息类型通信处理

项目概述

项目名称:itstack-demo-netty-2-10
核心功能:实现接收和发送多种协议消息类型的通信处理方案
技术要点:抽象类设计、工厂模式、策略模式、消息路由

为什么需要这个项目?

实际问题:

  • 实际应用中需要处理多种消息类型(登录、聊天、退出等)
  • 使用if-else判断消息类型,代码臃肿难维护
  • 新增消息类型需要修改现有代码,违反开闭原则
  • 缺少统一的消息处理框架

解决方案:

  • ✅ 抽象类设计:统一消息基类,规范消息结构
  • ✅ 工厂模式:根据指令自动创建对应的消息对象
  • ✅ 策略模式:每种消息类型对应一个Handler
  • ✅ 泛型路由:Netty自动根据泛型路由到对应Handler

适用场景:

  • IM系统(登录、聊天、群聊、文件传输等多种消息)
  • 游戏服务器(移动、攻击、交易等多种协议包)
  • 物联网平台(多种设备协议)
  • 复杂的业务系统(需要处理多种请求类型)

核心问题

为什么需要多协议支持?

在实际应用中(如聊天室),客户端与服务端需要发送多种消息类型:

  • 登录验证
  • 组建群聊
  • 发送消息
  • 退出登录

如果使用统一对象+if判断来分别转换,维护成本会非常大,不符合面向对象的设计思想。

传统方式的问题:

// ❌ 不好的设计
if (msgType == 1) {
    // 处理登录
} else if (msgType == 2) {
    // 处理群聊
} else if (msgType == 3) {
    // 处理消息
}
// 新增消息类型需要修改这里,违反开闭原则

核心知识点

1. 协议设计层

Packet.java - 抽象基类

public abstract class Packet {
    /**
     * 获取协议指令
     * @return 返回指令值
     */
    public abstract Byte getCommand();
}

Command.java - 指令常量

public interface Command {
    Byte Demo01 = 1;   // 测试01
    Byte Demo02 = 2;   // 测试02
    Byte Demo03 = 3;   // 测试03
}

PacketClazzMap.java - 指令与类的映射

public class PacketClazzMap {
    public final static Map<Byte, Class<? extends Packet>> packetTypeMap = 
        new ConcurrentHashMap<>();
    
    static {
        packetTypeMap.put(Command.Demo01, MsgDemo01.class);
        packetTypeMap.put(Command.Demo02, MsgDemo02.class);
        packetTypeMap.put(Command.Demo03, MsgDemo03.class);
    }
}
2. 消息实体设计

MsgDemo01.java

public class MsgDemo01 extends Packet {
    private String channelId;
    private String demo01;
    
    @Override
    public Byte getCommand() {
        return Command.Demo01;  // 返回唯一标识
    }
}
3. 编解码器实现

ObjEncoder.java - 编码器

public class ObjEncoder extends MessageToByteEncoder<Packet> {
    @Override
    protected void encode(ChannelHandlerContext ctx, Packet in, ByteBuf out) {
        byte[] data = SerializationUtil.serialize(in);
        out.writeInt(data.length + 1);      // 长度(数据+指令)
        out.writeByte(in.getCommand());     // 指令标识 ⭐
        out.writeBytes(data);               // 序列化数据
    }
}

数据格式:

[4字节长度][1字节指令][N字节数据]

ObjDecoder.java - 解码器

public class ObjDecoder extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {
        // 1. 读取长度
        int dataLength = in.readInt();
        
        // 2. 读取指令
        byte command = in.readByte();
        
        // 3. 读取数据
        byte[] data = new byte[dataLength - 1];
        in.readBytes(data);
        
        // 4. 根据指令找到对应的类,反序列化 ⭐
        out.add(SerializationUtil.deserialize(data, 
            PacketClazzMap.packetTypeMap.get(command)));
    }
}
4. 消息处理器

MsgDemo01Handler.java

public class MsgDemo01Handler extends SimpleChannelInboundHandler<MsgDemo01> {
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, MsgDemo01 msg) {
        // 只处理MsgDemo01类型的消息
        System.out.println("消息内容:" + msg.getDemo01());
    }
}

关键点:SimpleChannelInboundHandler<MsgDemo01> 使用泛型,Netty会自动路由!

5. Pipeline配置
protected void initChannel(SocketChannel channel) {
    channel.pipeline().addLast(new ObjDecoder());        // 解码
    channel.pipeline().addLast(new MsgDemo01Handler());  // 处理消息1
    channel.pipeline().addLast(new MsgDemo02Handler());  // 处理消息2
    channel.pipeline().addLast(new MsgDemo03Handler());  // 处理消息3
    channel.pipeline().addLast(new ObjEncoder());        // 编码
}

完整流程

客户端发送MsgDemo01对象
   ↓
ObjEncoder编码:
   - 序列化对象 → byte[]
   - 添加长度字段
   - 添加指令字段(Command.Demo01 = 1)
   ↓
网络传输:[长度][指令1][数据]
   ↓
服务端ObjDecoder解码:
   - 读取指令 = 1
   - 从PacketClazzMap找到 MsgDemo01.class
   - 反序列化为MsgDemo01对象
   ↓
Netty根据泛型路由到MsgDemo01Handler
   ↓
MsgDemo01Handler处理消息

项目总结

核心设计模式:

  • ✅ 策略模式:不同消息类型 = 不同策略
  • ✅ 工厂模式:PacketClazzMap充当工厂
  • ✅ 泛型+多态:自动路由消息

架构优势:

  • 新增消息类型只需:
    1. 创建新的消息类(继承Packet)
    2. 定义新的指令常量
    3. 在PacketClazzMap注册
    4. 创建对应的Handler
    5. 在Pipeline中添加Handler
  • 无需修改现有代码!(开闭原则)

适用场景:

  • IM系统(多种消息类型)
  • 游戏服务器(多种协议包)
  • 物联网平台(多种设备协议)

bugstack虫洞栈 | netty4.1案例文章列表汇总,跟着案例学Netty itstack-demo-netty netty4.x案例 微信公众号:bugstack虫洞栈,欢迎您的关注&获取更多案例与源码!博客栈:https://bugstack.cn 本专题针对netty4.x分为从;基础入门篇(九篇)、中级拓展篇(八篇)、高级应用篇(三章),由浅入深实现netty服务功能,介绍netty如何从上手到实战。 基础入门篇(九篇) netty案例,netty4.1... 阅读详情

相关推荐

netty案例,netty4.1中级拓展篇一《Netty与SpringBoot整合》

前言介绍 在实际的开发中,我们需要对netty服务进行更多的操作,包括;获取它的状态信息、启动/停止、对客户端用户强制下线等等,为此我们需要把netty服务加入到web系统中,那么本章节介绍如何将Netty与SpringBoot整合。 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使...

bugstack虫洞栈 2642

Netty实战应用学习笔记-中级拓展篇(一)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 1072

netty案例,netty4.1中级拓展篇五《基于Netty搭建WebSocket,模仿微信聊天页面》

前言介绍 本章节我们模仿微信聊天页面,开发一个基于Netty搭建WebSocket通信案例。Netty的应用方面非常广;聊天、MQ、RPC、数据等等,在5G到来的时候更加需要大量数据传输,Netty的应用也会更加广阔。 1、这个案例使用SpringBoot+Netty+WebSocket搭建功能。 2、使用Netty提供的HttpServerCodec、HttpObjectAggregator、...

bugstack虫洞栈 3072

Netty实战应用学习笔记-中级拓展篇(六)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 630

netty案例,netty4.1中级拓展篇十《Netty接收发送多种协议消息类型的通信处理方案》

前言介绍 在我们实际做应用级开发的过程中,客户端与服务端需要发送多种消息类型,比如一个聊天室场景包括的消息类型;登录验证、组建群聊、发送消息、退出登录等等,但如果我们都是用统一对象加if判断来分别转换,那么对后期的维护成本就会非常大,这样的代码方式也不是一个面向对象开发的思维。面向对象的开发思路,经常会把很多if、switch等逻辑抽象成对应的接口和抽象类,以及加入工厂方式对服务进行动态编排。 那...

bugstack虫洞栈 2697

netty案例,netty4.1中级拓展篇七《Netty请求响应同步通信》

前言介绍 在我们实现开发RPC框架的时候,需要选择socket的通信方式。而我们知道一般情况下socket通信类似与qq聊天,发过去消息,什么时候回复都可以。但是我们RPC框架通信,从感觉上类似http调用,需要在一定时间内返回,否则就会发生超时断开。这里我们选择netty作为我们的socket框架,采用future方式进行通信。 Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于...

bugstack虫洞栈 2265

Netty实战应用学习笔记-中级拓展篇(十二)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 1087

netty案例,netty4.1中级拓展篇三《Netty传输Java对象》

前言介绍 Netty在实际应用级开发中,有时候某些特定场景下会需要使用Java对象类型进行传输,但是如果使用Java本身序列化进行传输,那么对性能的损耗比较大。为此我们需要借助protostuff-core的工具包将对象以二进制形式传输并做编码解码处理。与直接使用protobuf二进制传输方式不同,这里不需要定义proto文件,而是需要实现对象类型编码解码器,用以传输自定义Java对象。 pro...

bugstack虫洞栈 2142

Netty实战应用学习笔记-中级拓展篇(九)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 1063

netty案例,netty4.1中级拓展篇十二《Netty流量整形数据流速率控制分析与实战》

作者:付政委 | 关注微信公众号:bugstack虫洞栈,获取专题案例源码 前言介绍 你是否使用过某盘,在前几年我们使用的时候速度飞快,上传下载嗖嗖嗖。但是近年来只要不办会员,速度慢的像蜗牛,当然人家也得赚钱我们能理解。那么这样的限速是怎么实现的呢,我们这个案例使用Netty的流量整形进行限速传输,测试过程中当你把流量整形功能去掉后你就是年费VIP。 流量整形(Traffic Shaping...

bugstack虫洞栈 3696

netty案例,netty4.1中级拓展篇四《Netty传输文件、分片发送、断点续传》

前言介绍 1、在实际应用中我们经常使用到网盘服务,他们可以高效的上传下载较大文件。那么这些高性能文件传输服务,都需要实现的分片发送、断点续传功能。 2、在Java文件操作中有RandomAccessFile类,他可以支持文件的定位读取和写入,这样就满足了我们对文件分片的最基础需求。 3、Netty服务端启动后,可以向客户端发送文件传输指令;允许接收文件、控制读取位点、记录传输标记、文件接收完成。 ...

bugstack虫洞栈 3229

Netty实战应用学习笔记-中级拓展篇(十三)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 570

netty案例,netty4.1中级拓展篇二《Netty使用Protobuf传输数据》

前言介绍 在netty数据传输过程中可以有很多选择,比如;字符串、json、xml、java对象,但为了保证传输的数据具备;良好的通用性、方便的操作性和传输的高性能,我们可以选择protobuf作为我们的数据传输格式。目前protobuf可以支持;C++、C#、Dart、Go、Java、Python等,也可以在JS里使用。知识点;ProtobufDecoder、ProtobufEncoder、Pr...

bugstack虫洞栈 2080

Netty实战应用学习笔记-中级拓展篇(八)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 640

netty案例,netty4.1中级拓展篇八《Netty心跳服务与断线重连》

前言介绍 在我们使用netty中,需要监测服务是否稳定以及在网络异常链接断开时候可以自动重连。需要实现监听;f.addListener(new MyChannelFutureListener()) 环境准备 1、jdk1.8【jdk1.7以下只能部分支持netty】 2、Netty4.1.36.Final【netty3.x 4.x 5每次的变化较大,接口类名也随着变化】 代码示例 itstack-...

bugstack虫洞栈 2069

虚幻UE 增强输入-触发器

输入触发器(UInputTrigger): 使用经过修饰器修改的输入值,或者使用其他输入动作的输出值,来确定是否激活输入动作。

UE成长之路,欢迎大家的关注! 5465

Netty实战应用学习笔记-中级拓展篇(五)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 636

高斯投影坐标正反算算法(python)

高斯坐标正反算算法,在正算的时候,y的第一个数字表示是用几度带换算的,第二个数字和第三个数字表示带号。该程序是根据武汉大学出版社出版的第三版的《大地测量学基础》编写, 用于课程实验学习。

weixin_64338372的博客 4588

Netty实战应用学习笔记-中级拓展篇(七)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 322

手把手教你用RMII接口配置以太网PHY芯片(附YT8512实战代码)

本文详细介绍了如何使用RMII接口配置以太网PHY芯片,以国产YT8512为例,提供从硬件设计到软件驱动的全流程实战指南。内容包括RMII接口技术解析、YT8512硬件设计要点、驱动开发实战代码及常见问题排查,帮助开发者快速实现以太网通信功能。

mac99的博客 996

基于LSTM GRU RNN的交通流量预测-完整数据代码

基于LSTM GRU RNN的交通流量预测-完整数据代码

923

Netty实战应用学习笔记-中级拓展篇(三)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 306

UG\NX二次开发 获取对象的层、颜色、隐藏状态、线宽、线型、高亮显示状态

获取对象的层、颜色、隐藏状态、线宽、线型、高亮显示状态。

王牌飞行员_里海的博客 1983
上一篇: Netty实战应用学习笔记-中级拓展篇(九)
下一篇: Netty实战应用学习笔记-中级拓展篇(十一)
不早睡不改名@
博客等级 码龄5年 536粉丝 306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值