跟闪电侠学Netty:Netty即时聊天实战与底层原理
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

8.1 什么是客户端与服务端的通信协议

无论使用Netty还是使用原始的Socket编程,基于TCP通信的数据包格式均为二进制,协议指的就是客户端与服务端事先商量好的,每一个二进制数据包中的每一段字节分别代表什么含义的规则。一个简单的登录指令如下图所示。

在这个数据包中,第一个字节为1表示这是一个登录指令,接下来是用户名和密码,这两个值以\0分割,客户端发送这段二进制数据包到服务端,服务端就能根据这个协议来取出用户名和密码,执行登录逻辑。在实际的通信协议设计中,我们会考虑更多细节,比这个协议稍微复杂一些。

那么,协议设计好之后,客户端与服务端的通信过程又是怎样的呢?

客户端与服务端的通信如下图所示。

1.客户端把一个Java对象按照通信协议转换成二进制数据包。

2.通过网络,把这段二进制数据包发送到服务端。在数据的传输过程中,由TCP/IP协议负责数据的传输,与应用层无关。

3.服务端接收到数据之后,按照协议取出二进制数据包中的相应字段,包装成Java对象,交给应用逻辑处理。

4.服务端处理完之后,如果需要生成响应给客户端,则按照相同的流程进行。

第1章已经列出了实现一个支持单聊和群聊的IM指令集合,设计协议的目的就是客户端与服务端能够识别这些具体的指令。接下来,我们就看一下如何设计这个通信协议。