【闪电侠学netty】第8章 客户端与服务端通信协议编解码
【Netty】读书笔记 - 跟闪电侠学
1. 内容概要
1.1 总结
1.1.1 编码与解码定义
编码:把java对象根据协议封装成二进制数据包的过程
解码:从二进制数据包中解析出Java对象的过程
1.1.2 设计了如下几个类
文件名 | 类型 | 描述 |
Serializer | interface | 作用:序列化抽象 接口中变量为常量(必须赋值)
> Serializer DEFAULT = new JSONSerializer():接口常量化 > byte getSerializerAlogrithm():获取序列化类型 > byte[] serialize(Object object):java 对象转换成二进制 > <T> T deserialize(Class<T> clazz, byte[] bytes):二进制转换成 java 对象
|
SerializerAlogrithm | interface | 作用:序列化号(记录类型) 接口中变量为常量(必须赋值)
> byte JSON = 1;// 类型:json
|
JSONSerializer | implements Serializer | 作用:json类型--序列化实现类
> byte getSerializerAlogrithm():获取序列化类型,这里初始化为JSON 返回如下:SerializerAlogrithm.JSON > byte[] serialize(Object object):java 对象转换成二进制 返回如下:JSON.toJSONBytes(object) > <T> T deserialize(Class<T> clazz, byte[] bytes):二进制转换成 java 对象 返回如下:JSON.parseObject(bytes, clazz)
|
Command | interface | 作用:指令号(记录类型) 接口中变量为常量(必须赋值)
> Byte LOGIN_REQUEST = 1;//指令号
|
Packet | abstract class | 作用:指令抽象类
> Byte version = 1;// 协议版本号
|
LoginRequestPacket | extends Packet | 作用:登录请求指令
> userId:用户id > username:用户名 > password:密码 > getCommand():获取指令号
|
PacketCodeC | class | 作用:编解码
> int MAGIC_NUMBER = 0x12345678:魔数 > Map<Byte, Class<? extends Packet>> packetTypeMap:存储数据包类型 > Map<Byte, Serializer> serializerMap:存储序列化类型 > static {}:初始化序列化实现类/序列化类型/数据包类型 > ByteBuf encode(Packet packet):编码 > Packet decode(ByteBuf byteBuf):解码 > Serializer getSerializer(byte b) :获取序列化实现类 > Class<? extends Packet> getRequestType(byte b):获取数据包类型
|
2. 课程内容
2.1 什么是客户端与服务端的通信协议
通信协议:客户端和服务端约定好的二进制数据包
2.2 通信协议的设计
2.2.1 魔数
- 长度:4 字节
- 作用:自定义协议标识
- 应用场景:约定协议的判断,数据包是否是约定的协议
2.2.2 版本标识
- 长度:1 字节
- 作用:版本号
- 应用场景:协议升级
2.2.3 序列化算法
- 长度:1 字节
- 作用:Java和二进制相互转换,如 JSON,Hessian
- 应用场景:编码与解码(客户端和服务端发送接收数据时)
2.2.4 指令
- 长度:1 字节,最高支持256种
- 作用:一种指令对应一种处理逻辑
- 应用场景:发送/接收指令(客户端和服务端)
2.2.5 数据长度
- 长度:4 字节
2.2.6 数据内容
- 长度:N 字节