基于Netty高性能RPC框架Nifty协议、传输层、编解码( 四 )
IntegerThriftCodec:
public class IntegerThriftCodec implements ThriftCodec
关于结构体编解码器ReflectionThriftStructCodec前面一大篇幅都是介绍这个 。
不管是哪种编解码器都是非常依赖协议的 , 只是编解码器做了一层抽象屏蔽了细节 , 方便我们使用 。
协议与传输协议TProtocal和传输组件TTransport是紧密相连的 , 协议内部是持有TTransport的 , 而TTransport可以理解为传输层 , 是直接与输出数据容器buffer打交道的;比如使用最多的就是TNiftyTransport , 内部会持有ChannelBuffer , 包含了从netty数据流中获取的ChannelBuffer和之后写到客户端的空的ChannelBuffer 。
我们先简单介绍协议定义了哪些接口 , 然后找个接口来看如何进行数据传输的 。
/** * Protocol interface definition. * */public abstract class TProtocol {protected TTransport trans_;protected TProtocol(TTransport trans) {trans_ = trans;}private boolean serverSide;private String serviceName;// getter, setter/*** Reading methods.*/public abstract TMessage readMessageBegin() throws TException;public abstract void readMessageEnd() throws TException;public abstract TStruct readStructBegin() throws TException;public abstract void readStructEnd() throws TException;public abstract TField readFieldBegin() throws TException;public abstract void readFieldEnd() throws TException;public abstract TMap readMapBegin() throws TException;public abstract void readMapEnd() throws TException;public abstract TList readListBegin() throws TException;public abstract void readListEnd() throws TException;public abstract TSet readSetBegin() throws TException;public abstract void readSetEnd() throws TException;public abstract boolean readBool() throws TException;public abstract byte readByte() throws TException;public abstract short readI16() throws TException;public abstract int readI32() throws TException;public abstract long readI64() throws TException;public abstract double readDouble() throws TException;public abstract String readString() throws TException;public abstract ByteBuffer readBinary() throws TException;/*** Writing methods.*/// ...复制代码
里面主要是数据的读和写方法 , 写和读方法是对应的就不同了 。 读的方法基本都会配合TProtocolReader来使用 , 写的方法基本都会配合TProtocolWriter来使用 。
- 开始和结束消息的读取 , 开始读取方法参数的时候会在初始和结尾进行调用, 可以获得方法的名字和请求的序号 。
- 开始和结束结构体的读取 , 在正式读取方法参数值的时候和读取完毕后进行调用 , 在TBinaryProtocal中可以认为是空实现 , readStructEnd通常在readMessageEnd之前 。
- 开始和结束参数的读取 , 每次读取一个参数都会调用 , readFieldBegin返回TField表示参数名称 , 类型和序号,基于此获取编解码器来读取参数值 , 最后再调用readFieldEnd 。
- 开始和结束集合的读取;
- 微软新版电子邮件客户端截图曝光:基于网页端Outlook
- 优刻得边缘计算产品正式更名UEC,打造低延时、高性能、低成本计算平台
- 曝光 | 小鹏或春节前推送NGP更新,基于高精地图可自动变道
- 基于Spring+Angular9+MySQL开发平台
- 玩游戏为什么推荐你买魅族17 不仅仅是高性能
- 14款华为手机/平板公测EMUI 11:全部基于麒麟980
- AI赋能,让消防、用电更“智慧”
- 深入理解Netty编解码、粘包拆包、心跳机制
- 基于安卓11打造!魅族17系列将升级全新Flyme 8
- 谷歌为用户提供了基于AR的虚拟化妆体验