• 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
  • 相关阅读:
    借助iMazing工具重新安装或升级 iOS系统
    【Liunx】:root 初始密码设置
    轻松省钱赚佣金:微信返利机器人的制作教程
    Android打造专有Hook第四篇,实战增量代码规范检查
    Docker 深度清除镜像缓存 (overlay2)
    Redis系列5:深入分析Cluster 集群模式
    两台电脑mysql数据迁移,各版本mysql迁移(亲测)
    题目0100-找单词
    每天五分钟机器学习:支持向量机损失函数和互熵损失函数
    掌握键盘快捷键,在没有鼠标的情况下,也还是可以做到游刃有余,甚至可以用数字键来代替鼠标
  • 原文地址:https://blog.csdn.net/zhouhe_/article/details/126411883