Netty技术全解析:MessageToMessageCodec类深度解析

news2024/9/24 23:23:48
❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」
☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
♝博主的话 : 搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基

Netty是一个高性能的网络编程框架,它提供了丰富的编解码器(Codec)来简化网络数据的处理。在Netty中,MessageToMessageCodec类是一个关键的编解码器组件,它同时实现了消息的编码和解码功能。本文将结合Netty的源码,详细分析MessageToMessageCodec类的工作原理、实现细节以及使用场景。

文章目录

      • 一、MessageToMessageCodec类概述
      • 二、源码解析
      • 三、工作原理
      • 四、使用场景
      • 五、注意事项
      • 六、结语

一、MessageToMessageCodec类概述

MessageToMessageCodec是Netty提供的一个抽象类,它同时继承了ChannelInboundHandlerAdapterChannelOutboundHandlerAdapter,因此它既可以处理入站消息(解码),也可以处理出站消息(编码)。这个类的主要作用是将业务消息对象与字节流或其他形式的消息进行相互转换,以便在网络中传输。

二、源码解析

首先,我们来看一下MessageToMessageCodec的核心源码结构。

public abstract class MessageToMessageCodec<INBOUND_IN, OUTBOUND_IN> 
    extends ChannelDuplexHandler {

    // 解码方法,需要子类实现
    protected abstract void decode(ChannelHandlerContext ctx, INBOUND_IN msg, List<Object> out) throws Exception;

    // 编码方法,需要子类实现
    protected abstract void encode(ChannelHandlerContext ctx, OUTBOUND_IN msg, List<Object> out) throws Exception;

    // 处理入站消息
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        List<Object> out = decode(ctx, (INBOUND_IN) msg, null);
        if (out != null) {
            for (Object o : out) {
                ctx.fireChannelRead(o);
            }
        } else {
            // 如果没有解码出消息,则释放原始消息
            ReferenceCountUtil.release(msg);
        }
    }

    // 处理出站消息
    @Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
        List<Object> encoded = encode(ctx, (OUTBOUND_IN) msg, promise.task());
        if (encoded == null || encoded.isEmpty()) {
            // 如果没有编码后的消息,则释放原始消息并设置promise成功
            ReferenceCountUtil.release(msg);
            promise.setSuccess();
        } else {
            // 如果有编码后的消息,则逐个写入
            for (Object e : encoded) {
                ctx.write(e, promise);
            }
        }
    }

    // ... 其他方法和字段
}

从源码中可以看出,MessageToMessageCodec类有两个关键的抽象方法:decodeencode。子类需要实现这两个方法来完成消息的解码和编码逻辑。

  • decode方法用于将入站消息(通常是字节流)解码为业务消息对象,并将解码后的消息传递给下一个ChannelInboundHandler进行处理。
  • encode方法用于将业务消息对象编码为出站消息(通常是字节流),以便发送到网络中。

三、工作原理

  1. 解码过程

    • 当有入站消息到达时,Netty会调用MessageToMessageCodecchannelRead方法。
    • channelRead方法内部会调用子类实现的decode方法进行解码。
    • 解码过程中,decode方法会根据具体的协议逻辑将入站消息(通常是字节流)解码为业务消息对象,并将解码后的消息添加到传入的List<Object>中。
    • 解码完成后,解码后的消息会被逐个传递给下一个ChannelInboundHandler进行处理。
  2. 编码过程

    • 当有出站消息需要发送时,Netty会调用MessageToMessageCodecwrite方法。
    • write方法内部会调用子类实现的encode方法进行编码。
    • 编码过程中,encode方法会根据具体的协议逻辑将业务消息对象编码为出站消息(通常是字节流),并将编码后的消息添加到传入的List<Object>中。
    • 编码完成后,编码后的消息会被逐个写入到网络中。

四、使用场景

MessageToMessageCodec适用于需要同时处理消息的编码和解码的场景。例如,在处理自定义协议时,可以使用MessageToMessageCodec将接收到的字节流解码为业务消息对象,并将业务消息对象编码为字节流发送到网络中。

五、注意事项

  1. 线程安全MessageToMessageCodec本身不是线程安全的。如果你的编解码逻辑涉及到共享资源的访问或修改,需要确保这些操作是线程安全的。
  2. 性能考虑:在编解码过程中,MessageToMessageCodec可能会创建新的消息对象,这可能会带来一定的内存开销。因此,在使用MessageToMessageCodec时,需要权衡其带来的便利和可能的性能开销。
  3. 异常处理:在编解码过程中,如果发生异常,需要妥善处理,例如记录日志、关闭连接等。

六、结语

MessageToMessageCodec是Netty中用于处理消息编解码过程的重要工具。通过提供一个抽象的编解码框架,它使得开发者可以更容易地编写基于消息的协议编解码逻辑。希望本文能够帮助开发者更好地理解MessageToMessageCodec类的工作原理和使用方法,并在实际开发中充分利用其提供的便利。


关注公众号[码到三十五]获取更多技术干货 !

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1993165.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有序数组的平方(LeetCode)

题目 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 解题 以下算法时间复杂度为 def sortedSquares(nums):n len(nums)result [0] * n # 创建一个结果数组&#xff0c;长度与 nums 相同le…

【wiki知识库】08.添加用户登录功能--前端Vue部分修改

&#x1f34a; 编程有易不绕弯&#xff0c;成长之路不孤单&#xff01; 目录 &#x1f34a; 编程有易不绕弯&#xff0c;成长之路不孤单&#xff01; 一、今日目标 二、前端Vue模块的修改 2.1 the-header组件 2.2 store工具 2.3 router路由配置修改 一、今日目标 上篇文章…

河南萌新联赛2024第(四)场:河南理工大学

河南萌新联赛2024第&#xff08;四&#xff09;场&#xff1a;河南理工大学 2024.8.7 13:00————17:00 过题数5/12 补题数8/12 该出奇兵了 小雷的神奇电脑 岗位分配 简单的素数 AND 小雷的算式 循环字符串 聪明且狡猾的恶魔 马拉松 尖塔第四强的高手 比赛 抓字符 B - 小雷…

企业如何选择靠谱的第三方软件测试机构?

第三方软件测试机构是专门提供软件测试服务的第三方检测机构&#xff0c;旨在对软件的功能、性能、安全性等方面进行系统评估&#xff0c;确保其满足设定的标准和需求。这些机构通常拥有丰富的行业经验和专业资质&#xff0c;可以为企业提供包括项目验收测试、软件确认测试、安…

贪吃蛇之地图的绘制

首先我们要知道地图位置大体是怎么样的 绘出一个大概的地图 设置了2020的方格 源码在这里 #include<curses.h>void initNcurse() {initscr();keypad(stdscr,1); }void gamePic() {int hang;int lie;for(hang0;hang<20;hang){if(hang0){for(lie0;lie<20;lie){pr…

开通期权分仓账户需要多少资金?

在金融衍生品市场&#xff0c;期权分仓账户犹如一艘精巧的帆船&#xff0c;承载着投资者的智慧与梦想&#xff0c;驶向财富的彼岸。然而&#xff0c;每一艘帆船的启航&#xff0c;都需备足风帆与给养&#xff0c;即那开启航程所必需的资金之舟&#xff0c;下文为大家介绍开通期…

【C语言基础习题】C语言练习题——bite 寒假班作业(6)【未完成】

编程小白如何成为大神?大学新生的最佳入门攻略 编程已成为当代大学生的必备技能,但面对众多编程语言和学习资源,新生们常常感到迷茫。如何选择适合自己的编程语言?如何制定有效的学习计划?如何避免常见的学习陷阱?让我们一起探讨大学新生入门编程的最佳路径,为你的大学…

【进阶篇-Day14:JAVA中IO流之转换流、序列化流、打印流、Properties集合的介绍】

目录 1、转换流1.1 转换流分类&#xff1a;1.2 转换流的作用&#xff08;1&#xff09;按照指定的字符编码读写操作&#xff1a;&#xff08;2&#xff09;将字节流转换为字符流进行操作&#xff1a; 2、序列化流2.1 序列化的基本使用&#xff1a;2.2 序列化的操作流程&#xf…

《Token-Label Alignment for Vision Transformers》ICCV2023

摘要 这篇论文探讨了数据混合策略&#xff08;例如CutMix&#xff09;在提高卷积神经网络&#xff08;CNNs&#xff09;性能方面的有效性&#xff0c;并指出这些策略在视觉Transformer&#xff08;ViTs&#xff09;上同样有效。然而&#xff0c;发现了一个“token fluctuation…

mp3音频怎么压缩小一点?音频压缩的6个简单方法

在日常的数字生活中&#xff0c;MP3音频文件凭借其广泛的兼容性和相对较高的音质&#xff0c;已然成为了连接音乐创作者与听众之间不可或缺的桥梁。从个人音乐收藏到社交媒体分享&#xff0c;再到专业音频项目的交付&#xff0c;MP3格式以其便捷性占据了重要地位。然而&#xf…

MLP:全连接神经网络的并行执行

目录 MLP:全连接神经网络的并行执行 假设 代码解释 注意事项 MLP:全连接神经网络的并行执行 为了继续解释这段代码,我们需要做一些假设和补充,因为原始代码片段中DummyModel、Shard和mx.array的具体实现没有给出。不过,基于常见的编程模式和深度学习框架的惯例,我们…

【Linux网络】Linux网络初探:开启网络世界的大门

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;我们已经系统的学习了Linux的基本操作、进程、线程、文件、通信等待&#xff0c;但是在如今社会没有网络通信方式是万万不行的&#xff0c;今天我们就走进网络中&#xff0c;系统的学习一下有关Linux网…

电脑外接设备管理软件有哪些(三款USB外设管理软件推荐)

“小张&#xff0c;你上次用U盘拷贝资料时&#xff0c;有没有担心过数据安全问题&#xff1f;” “是啊&#xff0c;李姐&#xff0c;我总感觉用U盘传文件不太放心&#xff0c;万一数据被误删或者泄露就麻烦了。” 正是这样的担忧&#xff0c;促使了电脑外接设备管理软件的出现…

让模型从Pytorch到NCNN——Pytorch模型向NCNN框架部署的小白向详细流程(PNNX模型转换、Linux模型使用)

参考文章和项目地址&#xff1a; [1] Tencent/ncnn: ncnn is a high-performance neural network inference framework optimized for the mobile platform (github.com) [2] pnnx/pnnx: PyTorch Neural Network eXchange (github.com) [3] 使用pnnx把pytorch模型转ncnn模型-CS…

重塑购车体验,实时云渲染赋能东风日产探路云看车新体验

在科技日新月异的今天&#xff0c;汽车行业正经历着前所未有的深刻变革。随着互联网、大数据、人工智能等新兴技术的深度融合&#xff0c;汽车营销策略也迎来了从传统展示到数字化体验的跨越。 消费者的购车习惯逐渐倾向于线上互动与深度体验&#xff0c;希望在线上获得线下同…

【docker】docker数据卷与网络部署服务

Docker 网络模式 选择网络模式 Host Mode (主机模式) 特点: 容器与宿主机共享网络命名空间操作: docker run --nethost ... Container Mode (容器模式) 特点: 容器与指定容器共享网络命名空间操作: docker run --netcontainer:<container-id-or-name> ... None Mode (无…

XP服务器-远程桌面连接不上

今天遇到个很奇怪的事&#xff0c;xp服务器突然远程桌面连接不上了&#xff0c;根据上网百度的结果&#xff0c;防火墙关了&#xff0c;也允许远程连接了。我之前修改过服务器的默认端口号3389&#xff0c;改为了新端口号A&#xff0c;但是当时修改完是可以正常登陆的。而且新端…

004集——静态常量和动态常量——C#学习笔记

首先普及一个小白使用的小技巧&#xff1a;tab键可以自动输出系统显示的引导字符。 常量是使用 const 关键字来定义的 。定义一个常量的语法如下&#xff1a; const <data_type> <constant_name> value; 下面的代码演示了如何在程序中定义和使用常量&#xff1…

win服务器cmd执行exe文件失败

问题场景 场景&#xff1a;用python打包的exe文件&#xff0c;在cmd下执行是没问题的&#xff0c;放到定时任务就不执行。。。动di脚本调试没问题&#xff0c;打包成exe可执行程序也能正常运行。就是放到定时任务有问题。 解决&#xff1a; 解决方案 1.打开计划任务创建计划任…

OpenGL3.3_C++_Windows(34)

demo 1 Fresnel-Schlick PBR直接光源 顾名思义&#xff1a;直接光源指有光源直接照射到点p 的辐射强度&#xff0c;由于一个光源只会有一个光线wi影响点p&#xff0c;所以和之前的计算没什么差异对于影响p的光源&#xff0c;并不需要积分计算半球形辐照度&#xff0c;遍历每个…