Netty 系列之编解码器和 handler 的调用机制

2023-11-07

编码和解码的基本介绍

  • 编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码

  • codec(编解码器) 的组成部分有两个:decoder(解码器)和 encoder(编码器)。encoder 负责把业务数据转换成字节码数据,decoder 负责把字节码数据转换成业务数据

Netty 本身的编码解码的机制和问题分析

  • Netty 自身提供了一些 codec(编解码器)

  • Netty 提供的编码器

  • StringEncoder,对字符串数据进行编码

  • ObjectEncoder,对 Java 对象进行编码

  • Netty 提供的解码器

  • StringDecoder, 对字符串数据进行解码

  • ObjectDecoder,对 Java 对象进行解码

  • Netty 本身自带的 ObjectDecoder 和 ObjectEncoder 可以用来实现 POJO 对象或各种业务对象的编码和解码,底层使用的仍是 Java 序列化技术 , 而 Java 序列化技术本身效率就不高,存在如下问题

  • 无法跨语言

  • 序列化后的体积太大,是二进制编码的 5 倍多。

  • 序列化性能太低=> 引出 新的解决方案 [Google 的 Protobuf]

Java 序列化

Protobuf 基本介绍

  • Protobuf 是 Google 发布的开源项目,全称 Google Protocol Buffers,是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC[远程过程调用 remote procedure call ] 数据交换格式 。目前很多公司 http+json 转成 tcp+protobuf

  • 参考文档 : https://developers.google.com/protocol-buffers/docs/proto 语言指南

  • Protobuf 是以 message 的方式来管理数据的支持跨平台、跨语言,即[客户端和服务器端可以是不同的语言编写的] (支持目前绝大多数语言,例如 C++、C#、Java、python 等)

  • 高性能,高可靠性

  • 使用 protobuf 编译器能自动生成代码,Protobuf 是将类的定义使用.proto 文件进行描述。说明,在 idea 中编写 .proto 文件时,会自动提示是否下载 .ptotot 编写插件. 可以让语法高亮。

  • 然后通过 protoc.exe 编译器根据.proto 自动生成.java 文件

  • protobuf 使用示意图

具体使用

小六六这边就不一一举例说明了,毕竟我也是第一次接触嘛,先了解了解,后面用到了就去找案例就好了,稍微说一下

先写一个这样的执行文件

然后通过它的编译器生成你需要的实体

然后再 Netty 中使用

大概就是这么个流程,其实我们只要知道我们的目的是什么了就好了,我们就是加快序列化的速度嘛

Netty 编解码器和 handler 的调用机制

基本说明

  • netty 的组件设计:Netty 的主要组件有 Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe 等

  • ChannelHandler 充当了处理入站和出站数据的应用程序逻辑的容器。例如,实现 ChannelInboundHandler 接口(或 ChannelInboundHandlerAdapter),你就可以接收入站事件和数据,这些数据会被业务逻辑处理。当要给客户端发送响应时,也可以从 ChannelInboundHandler 冲刷数据。业务逻辑通常写在一个或者多个 ChannelInboundHandler 中。ChannelOutboundHandler 原理一样,只不过它是用来处理出站数据的

  • ChannelPipeline 提供了 ChannelHandler 链的容器。以客户端应用程序为例,如果事件的运动方向是从客户端到服务端的,那么我们称这些事件为出站的,即客户端发送给服务端的数据会通过 pipeline 中的一系列 ChannelOutboundHandler,并被这些 Handler 处理,反之则称为入站的

再讲编码解码器

  • 当 Netty 发送或者接受一个消息的时候,就将会发生一次数据转换。入站消息会被解码:从字节转换为另一种格式(比如 java 对象);如果是出站消息,它会被编码成字节。

  • Netty 提供一系列实用的编解码器,他们都实现了 ChannelInboundHadnler 或者 ChannelOutboundHandler 接口。在这些类中,channelRead 方法已经被重写了。以入站为例,对于每个从入站 Channel 读取的消息,这个方法会被调用。随后,它将调用由解码器所提供的 decode()方法进行解码,并将已经解码的字节转发给 ChannelPipeline 中的下一个 ChannelInboundHandler。

解码器-ByteToMessageDecoder

  • 关系继承图

我们可以看到还是继承了 ChannelInboundHandler

  • 由于不可能知道远程节点是否会一次性发送一个完整的信息,tcp 有

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Netty 系列之编解码器和 handler 的调用机制 的相关文章

随机推荐

  • 不做标题党软文营销如何写出好标题

    为软文选择出色的软文标题是任何内容营销策略不可或缺的一部分 吸引人的标题可以使读者点击开始阅读 知道什么标题效果好 这对软文的整体参与度和转化率有很大帮助 读者点开你的软文次数越多 业务就会获得更多的曝光度 因此引人注目的软文标题至关重要
  • 亲测——eclipse中windowBuilder插件的5种安装方式

    windowBuilder的安装方法 方法1 在Eclipse MarketPlace 插件市场中搜索在线安装 依次点击help Eclipse MarketPlace 在find中搜索 windowBuilder点击install安装即可
  • as3 java 交互_AS3与交互

    1 与Socket服务器建立连接 2 向Socket服务器发送数据 3 从Socket服务器读数据 4 同Socket服务器进行握手 并确定收到了什么样的数据和如何处理这些数据 5 与Socket服务器断开 或者当服务器想与你断开的时候发消
  • 漫步数理统计三十一——依分布收敛

    上篇博文我们介绍了依概率收敛的概念 利用着概念我们可以说统计量收敛到一个参数 而且在许多情况下即便不知道统计量的分布函数也能说明收敛 但是统计量有多接近估计量呢 本篇博文讲的收敛就回答了这个问题 定义1 textbf 23450 20041
  • 深圳地铁远期规划20条线路图首发

    深圳市城市轨道网络远期共规划了20条线路 总里程约748 5公里 含弹性发展线路约73 7公里 同时规划了5条城际线路 形成约146 2公里的城际线网 加上国家铁路 深圳市轨道交通总里程远景规划将达到1080公里 轨道规模和密度与东京等国际
  • git commit回退,lfs上传

    一 如何回退到之前的commit 1 查看之前的commit git log 选择一个commit 执行 git reset hard commit号 会清空当前目录下和仓库不一致的文件 回退commit但不删除代码 可以 git rese
  • 小程序调用接口报错,会返回 {“error“:600001,“errMsg“:“request:fail -102:net::ERR_CONNECTION_REFUSED“} 问题。

    error 600001 errMsg request fail 102 net ERR CONNECTION REFUSED 这个错误是网络连接被拒绝的错误 它通常表示无法建立与服务器的连接 这种问题可能有几个可能的原因 1 服务器故障
  • PyTorch 深度学习实践 第8讲

    第8讲 加载数据集 源代码 B站 刘二大人 传送门PyTorch深度学习实践 加载数据集 说明 1 DataSet 是抽象类 不能实例化对象 主要是用于构造我们的数据集 2 DataLoader 需要获取DataSet提供的索引 i 和le
  • python基础------时间戳、时间组、时间串、日期相互转化和日历以及练习

    1 时间组 时间戳 时间串相互转化 import time 时间戳 tt time time print tt 时间组 b time localtime tt print b 时间组转化为时间串 striftime asctime c ti
  • VS2015编译Boost1.64

    一 下载并解压 boost1 64 0 http www boost org users history version 1 64 0 html
  • 机器学习和传统编程的比较

    该文章 对机器学习和传统编程方法进行了比较 一个结论值得重视 ML just like AI is not a substitution but supplementation for traditional programming app
  • Linux网络编程:IO多路复用——poll

    服务器端代码 poll 对select技术的改进 include
  • 英语介词学习(基础)

    文章目录 前言 介词概念 常见介词 空间介词 时间介词 方式介词 原因介词 关于介词 数值介词 状态介词 排除介词 总结 前言 本文主要目的是为了辨析各类基础介词 为了更好的背诵一些短语介词 如有错误 欢迎指正 介词概念 介词用来表示前置词
  • JAVA基础编程练习题

    编写一个程序 输入两个整数 计算它们的和并输出结果 import java util Scanner public class Main public static void main String args Scanner input n
  • os.getcwd()以及os.walk()用法

    os getcwd 以及os walk 用法 os getcwd 获取当前代码文件所在路径 例如 os getcwd 输出 C Users 17843 Jyputer notebook file word转换pdf源代码 os walk 获
  • 使用java实现基础的家庭记账程序

    家庭记账程序 需求说明 具体操作 完整代码 总结 需求说明 1 该程序能够记录家庭的收入 支出 并能打印收支明细表 2 项目采用分级菜单的方式 主菜单如下 3 假设家庭起始的生活基本金为10000元 4 每次登记收入 菜单2 后 收入的金额
  • java种的 author,在Intellij中自动完成@author

    I m migrating from Eclipse to Intellij Idea One thing I couldn t figure out yet is autocompletion of the author JavaDoc
  • linux命令后缀-d和 都表示后台启动,Linux复习材料_关宇亮整理版.doc

    Linux复习材料 关宇亮整理版 Linux目录 第1章1 Linux的内核版与发行版的区别2 2个开发标准规范 4 常见的Linux发行版 5 Unix与Linux的关系与区别 6 Linux的特性与优缺点 7 Linux的安装与分区 分
  • “微众区块链”品牌正式发布

    4月27日下午 以 新机遇 新使命 新出发 为主题的微众区块链品牌全新发布会在深圳成功举行 会上 微众银行正式宣布推出 微众区块链 全新品牌 并提出了 构筑ESG可信基础设施 促进公平与可持续 的全新使命 致力于为ESG 环境 社会和公司治
  • Netty 系列之编解码器和 handler 的调用机制

    编码和解码的基本介绍 编写网络应用程序时 因为数据在网络中传输的都是二进制字节码数据 在发送数据时就需要编码 接收数据时就需要解码 codec 编解码器 的组成部分有两个 decoder 解码器 和 encoder 编码器 encoder