• Netty编码和解码


    编码和解码的基本介绍

    1. 编写网络应用程序时,因为数据在网络中传输的都是二机制字节码数据,在发送数据时就需要编码,接收数据时就需要解码
    2. codec(编解码器)的组成有两个:decoder(解码器)和encoder(编码器)。encoder负责把业务数据转换成字节码数据,decoder负责把字节码数据转换成业务数据

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

    1. Netty自身提供了一些codec(编解码器)
    2. Netty提供的编码器
      StringEncoder,对字符串数据进行编码
      ObjectEncoder,对java对象进行编码
    3. Netty提供的解码器
      StringDecoder,对字符串数据进行解码
      ObjectDecoder,对java对象进行解码
    4. Netty本身自带的ObjectDecoder和ObjectEncoder,可以实现POJO对象或各种业务对象的编码解码,底层仍然是使用java序列化技术,而java序列化技术本身效率就不高,存在以下问题
    • 无法跨语言
    • 序列化后的体积太大,是二进制编码的5倍多
    • 序列化性能太低
      ====》 引出 醒的解决方案 【Google 的Protobuf】

    Protobuf

    1. Protobuf是Google发布的开源项目,全称Google Protocol Buffers,是一种轻便搞笑的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。他很适合做数据存储或RPC数据格式交换
    2. 参考文档:https://developers.google.com/protocol-buffers/docs/proto
    3. Protobuf是以message的方式来管理数据的
    4. 支持跨语言,跨平台。
    5. 高性能,高可靠
    6. 使用protobuf编译器能自动生成代码,protobuf是将类的定义使用.proto文件进行描述,说明,在idea中编写.proto文件时,会自动提示下砸 .proto编写插件,可以让语法高亮
    7. 然后通过 protoc.exe编译器根据.proto自动生成java文件
    8. protobuf请添加图片描述

    Protobuf快速入门

    描述:客户端可以发送一个Studen POJO对象到服务器+(通过Protobuf编码)
    服务端能够在接受Student Pojo对象,并显示信息 (通过Protobuf解码)

    使用参考:https://blog.csdn.net/wei198621/article/details/108836136

    protobuf传输多种类型:https://blog.csdn.net/qq_28497823/article/details/106354008

    Netty入站和出站机制

    1. Netty的组件设计:Netty的主要组件有Channel,EventLoop,ChannelFuture、ChannelHandler,ChannelPipe等
    2. ChannelHandler充当了两处理入站和出站数据的应用程序逻辑的容器。例如,实现ChannelInboundHandler接口(或channelInboundHandlerAdapter),你就可以接收入站事件和数据,这些数据会被业务逻辑处理。当要给客户端发送响应时,也可以从ChannelInboundHandler冲刷数据。业务逻辑通常写在一个或多个ChannelInboudHandler中。ChannelOutboundHandler原理一样,只不过它是用来处理出站数据的
    3. ChannelPipeline提供了ChannelHandler链的容器。以客户端应用程序为例,如果事件的运动方向是从客户端到服务器,那么我们称为这些事件 使出站的,即客户端发送给服务器的数据会通过一系列ChannelOutboundHandler,并被这些Handler处理,反之成为入站
      请添加图片描述
    • 编码解码器
    1. 当Netty发送或者接收一个消息的时候,就会发生一次数据转换。入站消息会被解码;从字节转换成另一种格式(比如java对象);如果是出站消息,他会被编码成字节
    2. Netty提供一系列实用的编解码器,他们实现了ChannelInboundHandler或者ChannelOutBoundHandler接口。在这些类中,channelRead方法已经被重写了。以入站为例,对于每个从入站Channel读取的消息,这个方法会被调用。随后,他将调用 由解码器所提供的decode()方法进行解码,并将已经解码的字节转发给ChannelPipline中的下一个ChannelInboundHandler
  • 相关阅读:
    利用Power Automate,轻松下载Power BI报告中的数据
    DataFunSummit 2023因果推断在线峰会:解码数据与因果,引领智能决策新篇章(附大会核心PPT下载)
    AI究竟能提升多少效率?哈佛已揭秘量化结果
    Linux系统LVM逻辑卷
    零基础5分钟上手亚马逊云科技AWS核心云架构知识 - 为应用配置自动扩展
    【设计模式】结构型设计模式之 享元模式
    vue实现一个鼠标滑动预览视频封面组件(精灵图版本)
    编程向导-JavaScript-基础语法-算术/赋值/逗号/运算符
    通过有序线性结构构造AVL树
    CocosCreator-获取游戏可见宽高,真实宽高
  • 原文地址:https://blog.csdn.net/zhouhe_/article/details/126411883