编码和解码的基本介绍
- 编写网络应用程序时,因为数据在网络中传输的都是二机制字节码数据,在发送数据时就需要编码,接收数据时就需要解码
- 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】
Protobuf
- Protobuf是Google发布的开源项目,全称Google Protocol Buffers,是一种轻便搞笑的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。他很适合做数据存储或RPC数据格式交换
- 参考文档:https://developers.google.com/protocol-buffers/docs/proto
- Protobuf是以message的方式来管理数据的
- 支持跨语言,跨平台。
- 高性能,高可靠
- 使用protobuf编译器能自动生成代码,protobuf是将类的定义使用.proto文件进行描述,说明,在idea中编写.proto文件时,会自动提示下砸 .proto编写插件,可以让语法高亮
- 然后通过 protoc.exe编译器根据.proto自动生成java文件
- 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入站和出站机制
- Netty的组件设计:Netty的主要组件有Channel,EventLoop,ChannelFuture、ChannelHandler,ChannelPipe等
- ChannelHandler充当了两处理入站和出站数据的应用程序逻辑的容器。例如,实现ChannelInboundHandler接口(或channelInboundHandlerAdapter),你就可以接收入站事件和数据,这些数据会被业务逻辑处理。当要给客户端发送响应时,也可以从ChannelInboundHandler冲刷数据。业务逻辑通常写在一个或多个ChannelInboudHandler中。ChannelOutboundHandler原理一样,只不过它是用来处理出站数据的
- ChannelPipeline提供了ChannelHandler链的容器。以客户端应用程序为例,如果事件的运动方向是从客户端到服务器,那么我们称为这些事件 使出站的,即客户端发送给服务器的数据会通过一系列ChannelOutboundHandler,并被这些Handler处理,反之成为入站
- 当Netty发送或者接收一个消息的时候,就会发生一次数据转换。入站消息会被解码;从字节转换成另一种格式(比如java对象);如果是出站消息,他会被编码成字节
- Netty提供一系列实用的编解码器,他们实现了ChannelInboundHandler或者ChannelOutBoundHandler接口。在这些类中,channelRead方法已经被重写了。以入站为例,对于每个从入站Channel读取的消息,这个方法会被调用。随后,他将调用 由解码器所提供的decode()方法进行解码,并将已经解码的字节转发给ChannelPipline中的下一个ChannelInboundHandler