最后更新:2022-02-14 14:45:33 手机定位技术交流文章
我们常用的聊天软件比如:微信,都是基于一组通信协议进行服务端与客户端数据交互。协议指的就是客户端与服务端事先约定好的,每个二进制数据包中,每一段字节分别代表什么含义的规则。如下图所示一个简单的登录指令:
在这个数据包中,第一个字节为 1 表示这是一个登录指令,接下来是用户名和密码,这两个值以 分割,客户端发送这段二进制数据包到服务端,服务端就能根据这个协议来取出用户名密码,进行登录逻辑。实际的通信协议设计中,我们会考虑更多细节,要比这个稍微复杂一些。
那么,协议设计好之后,客户端与服务端的通信过程又是怎样的呢?

通常情况下,这样一套标准的协议能够适配大多数情况下的服务端与客户端的通信场景,接下来我们就来看一下我们如何使用 Netty 来实现这套协议。
我们把Java 对象封装成二进制的过程叫编码, 从二进制数据包解析成 Java 对象的过程叫解码,在学习如何使用 Netty 进行通信协议的编解码之前,我们先来定义一下客户端与服务端通信的 Java 对象。
接下来,我们拿客户端登录请求为例,定义登录请求数据包
Command 定义一些指令,不同的 command 指令分别对应不同的数据内容。
这里 Command 定义了 LOGIN_REQUEST 指令表示登录请求,相应的就会有与之对应的 Java 对象 LoginRequestPacket。
Java 对象定义完成之后,接下来我们就需要定义一种规则,如何把一个 Java 对象转换成二进制数据,这个规则叫做 Java 对象的序列化。
定义序列化接口:
序列化接口的实现,这里我们使用最简单的 json 序列化方式,使用阿里巴巴的 fastjson 作为序列化框架:
这样我们就实现了序列化的相关逻辑。
序列化定义了 Java 对象与二进制数据的互转过程,接下来,我们就来学习一下,如何把这部分的数据编码到通信协议的二进制数据包中去。
分为三个步骤:
编码完成之后会发送给另一端,另一端就需要进行解码操作。
解码过程刚刚好和编码过程相反。
我们了解了什么是通信协议,并且自己动手实现一个简单的通信协议,还了解到了编码和解码的过程。
文章参考:
https://juejin.im/book/5b4bc28bf265da0f60130116
代码下载:
https://github.com/jeansTuo/-
本文由 在线网速测试 整理编辑,转载请注明出处。