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

news2024/9/27 12:17:28

【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 通信协议的实现 (见原书代码)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MacOS Docker 安装和运行原理

本文讲述主要是基于Mac电脑安装教程&#xff0c;使用的是homebrew安装&#xff0c;未安装homebrew的请先自行安装下 一、使用 Homebrew 安装 macOS 我们可以使用 Homebrew 来安装 Docker。Homebrew 的 Cask 已经支持 Docker for Mac&#xff0c;因此可以很方便的使用 Homebrew…

【代码实验】CNN实验——利用Imagenet子集训练分类网络(AlexNet/ResNet)

文章目录前言一、数据准备二、训练三、结果前言 Imagenet是计算机视觉的经典分类比赛&#xff0c;但是Imagenet数据集本身太大了&#xff0c;我们穷学生没有这么大的算力&#xff0c;2016年google DeepMind团队从Imagnet数据集中抽取的一小部分&#xff08;大小约3GB&#xff…

DBCO-PEG-Methacrylate_DBCO-PEG-MA_二苯并环辛炔-PEG-甲基丙烯酸酯

一、试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a;DBCO&#xff08;二苯并环辛炔&#xff09;是一种环炔烃&#xff0c;可以通过在水溶液中通过应变促进的1,3-偶极环加成反应与叠氮化物反应&#xff0c;这种生物正交反应也称为…

Crack:MindFusion.Diagramming for ASP.NET V7.0

MindFusion.Diagramming for ASP.NET V7.0 MindFusion.Diagramming for ASP.NET 为 Web 应用程序提供图表功能。它包括丰富的预定义图表节点以及具有无限行数和列数的表节点。您可以在容器中组织节点&#xff0c;形状设计器 UI 工具可帮助您快速轻松地生成自己的图表节点。 添加…

GD32F450工程模板创建

一、新建工程目录 序号文件夹备注1Project存放工程文件&#xff0c;编译文件等。2Firmware存放ARM内核文件&#xff0c;标准外设库文件等。3Hardware存放开发板的硬件驱动文件。4App存放应用层文件。5User存放main函数&#xff0c;gd32f4xx_it文件&#xff0c;systick文件。6D…

【GD32F427开发板试用】07-硬件SPI驱动0.96LCD

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;Stark_GS SPI 简介及特点 具有全双工、半双工和单工模式的主从操作。16位宽度&#xff0c;独立的发送和接收缓冲区。8位或16位数据帧格式。低…

火出圈的《中国奇谭》,如果浪浪山的小妖怪们也用WorkPlus

你会被一只小妖怪感动到破防吗&#xff1f; 最近&#xff0c;由上海美术电影制片厂和B站联合推出的动画片《中国奇谭》火了&#xff0c;仅仅一上线就被打出9.9的高分&#xff0c;频繁登上微博热搜。 其中&#xff0c;第一集《小妖怪的夏天》取材自《西游记》&#xff0c;却从…

Unity编辑器右键菜单实现多平台游戏资源打包—AssetBundle的构建

文章目录&#x1f449;一、初识AssetBundle&#x1f449;二、创建AssetBundle&#x1f449;三、动手操作&#xff1a;实现右键菜单打包AssetBundle&#x1f449;一、初识AssetBundle AssetBundle是Unity提供的一种打包资源的文件格式&#xff0c;比如模型、纹理和音频文件等的各…

大数据导论

数据是什么数据是指对客观事件进行记录并可以鉴别的符号&#xff0c;是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合&#xff0c;它是可识别的、抽象的符号。它不仅指狭义上的数字&#xff0c;还可以是具有一定意义的文字、字母、数字符号的组…

python学习 --- 元组基础

目录 一、什么是元组 1、不可变序列和可变序列 2、元组 二、 元组的创建方式 1、小括号&#xff08;可省略&#xff09; 2、内置函数tuple() 三、元组的获取与遍历 1、元组的获取 2、元组的遍历 一、什么是元组 1、不可变序列和可变序列 不可变序列&#xff1a;没有增…

使用streamlit记录

官方网址&#xff1a;https://docs.streamlit.io/ 官方网址&#xff1a;https://discuss.streamlit.io/t/streamlit-components-community-tracker/4634 官方网址&#xff1a;https://github.com/streamlit/streamlit 第三方插件网址&#xff1a;https://github.com/arnaudmiri…

Solidity 中的数学(第 2 部分:溢出)

本文是关于在 Solidity 中进行数学运算的系列文章中的第二篇。这次的主题是&#xff1a;溢出。 介绍 每次我看到、*或**审计另一个 Solidity 智能合约时&#xff0c;我都会开始写以下评论&#xff1a;“这里可能会溢出”。我需要几秒钟来写这四个字&#xff0c;在这几秒钟内&a…

【Pandas】18 小练习

#【Pandas】18 小练习 2023.1.16 两个pandas小练习 18.1 疫情数据分析 18.1.1 观察数据 import pandas as pd import osdf pd.read_csv("data/covid19_day_wise.csv") dfDateConfirmedDeathsRecoveredActiveNew casesNew deathsNew recoveredDeaths / 100 CasesR…

日常渗透刷洞的一些小工具

SecurityServiceBox&#xff1a;一个Windows平台下既可以满足安服仔日常渗透工作也可以批量刷洞的工具盒子 0x00 更新题外话—终端选取 在盒子的tools当中&#xff0c;很多工具运行都是带有颜色标识的&#xff0c;例如nuclei&#xff0c; vulmap&#xff0c;原生的cmd终端虽然…

MD5有哪些特性,常用的MD5加密真的安全吗

在密码学中&#xff0c;MD5是比较常用的算法之一。大家都知道MD5曾一度被认为十分安全&#xff0c;并且在国内外得到广泛适用。然而&#xff0c;王小云教授的研究证明利用MD5算法的磕碰能够严重威胁信息体系安全&#xff0c;因此引发了密码学界的轩然大波。那么&#xff0c;关于…

为什么JDK中String类的indexof不使用KMP或者Boyer-Moore等时间复杂度低的算法编辑器

indexOf底层使用的方法是典型的BF算法。 1、KMP算法 由来 外国人&#xff1a; Knuth&#xff0c;Morris和Pratt发明了这个算法&#xff0c;然后取它三个的首字母进行了命名。所以叫做KMP。 KMP真的很难理解&#xff0c;建议多看几遍 B站代码随想录&#xff0c;文章也的再好 …

【蓝桥杯备赛系列 | 真题 | 简单题】2014年第五届真题-分糖果

&#x1f935;‍♂️ 个人主页: 计算机魔术师 &#x1f468;‍&#x1f4bb; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 蓝桥杯竞赛专栏 | 简单题系列 &#xff08;一&#xff09; 作者&#xff1a; 计算机魔术师 版本&#xff1a; 1.0 &#xff08…

【博客597】iptables如何借助连续内存块通过xt_table结构管理流量规则

iptables如何借助连续内存块通过xt_table结构管理流量规则 1、iptables 分为两部分&#xff1a; 用户空间的 iptables 命令向用户提供访问内核 iptables 模块的管理界面。内核空间的 iptables 模块在内存中维护规则表&#xff0c;实现表的创建及注册。 2、iptables如何管理众…

第十二章 数据库设计

前言 本文章为看视频所写。 视频链接&#xff1a;168. 14.1 数据库设计前言_哔哩哔哩_bilibili 目录 前言 章节提要 一、数据库设计过程 二、E-R模型 三、答题技巧 四、案例分析 1、案例1 二、案例2 章节提要 一、数据库设计过程 ER模型&#xff1a;是实体联系模型&#x…

第一章 数据结构绪论

数据结构&#xff1a;是相互之间存在一种或多种特定关系的数据元素的集合。数据结构是一门研究非数值计算的程序设计问题中的操作对象&#xff0c;以及它们之间关系和操作等相关问题的学科。程序设计数据结构算法数据&#xff1a;是描述客观事物的符号&#xff0c;是计算机中可…