当前位置: 首页 > news >正文

【闪电侠学netty】第8章 客户端与服务端通信协议编解码

【Netty】读书笔记 - 跟闪电侠学

1. 内容概要

1.1 总结

1.1.1 编码与解码定义

        编码:把java对象根据协议封装成二进制数据包的过程

        解码:从二进制数据包中解析出Java对象的过程

1.1.2 设计了如下几个类

文件名类型描述
Serializerinterface

作用:序列化抽象

接口中变量为常量(必须赋值)

  

> Serializer DEFAULT = new JSONSerializer():接口常量化

> byte getSerializerAlogrithm():获取序列化类型

> byte[] serialize(Object object):java 对象转换成二进制

> <T> T deserialize(Class<T> clazz, byte[] bytes):二进制转换成 java 对象

  

SerializerAlogrithminterface

作用:序列化号(记录类型)

接口中变量为常量(必须赋值)

  

> byte JSON = 1;// 类型:json

  

JSONSerializerimplements 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)

 

Commandinterface

作用:指令号(记录类型)

接口中变量为常量(必须赋值)

  

> Byte LOGIN_REQUEST = 1;//指令号

   

Packet

abstract

class

作用:指令抽象类

 

> Byte version = 1;// 协议版本号
> abstract Byte getCommand(); //获取指令号

 

LoginRequestPacketextends Packet

作用:登录请求指令

 

userId用户id

username用户名

> password密码

getCommand():获取指令号

 

PacketCodeCclass

作用:编解码

  

> 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 字节

3 通信协议的实现 (见原书代码)

相关文章:

  • 阿里云轻云服务器可以放多个网站啊怎么做/百度快速排名软件
  • 长安做网站价格/武汉百度推广优化
  • 网站盈利模式有哪几种/百度竞价开户公司
  • 平面图设计网站/广告软文200字
  • 作图网站都有哪些/百度收录站长工具
  • nodejs做静态网站/老铁外链
  • kdump 机制
  • 本地服务器如何让外网远程桌面连接?
  • 高级语言(C语言)、汇编语言、机器语言区别?编译器如何将高级语言编译成机器语言?
  • SOLIDWORKS 2023新功能揭秘!装配体升级 阵列实例、配合错误修复、零件替换同步更新
  • postman接口关联
  • APM vs NPM
  • 智能门锁-手机应用相机国产、非国产统计参数对比分析
  • 字符加密-C语言实现
  • 字符矩阵内单词搜索
  • C语言经典100例(027,028,029,030)
  • 虚拟机本地搭建Hadoop集群教程
  • 基于A*搜索和深度优先搜索解迷宫问题