1.先来进行一个简单的单工通信通道:
可以看到,client 和 server 已经打通通信,实现一个简单的单工通信通道。
下面要实现一个半双工通信通道,我们需要的是客户端和服务端有来有往的进行交流。
如上,在客户端随机发送id(id转化为buffer传输)到服务端,服务端根据id获取课程列表里的内容返回到客户端,这边是一个简单的半双工通信通道。
通过在client端的socket监听服务端传过来的数据,每当监听到,就继续向服务端传入id获取课程内容,实现客户端和服务端的连续交互,如下:
以上就是半双工通信。那么半双工通信和全双工通信到底有什么不一样呢?比如半双工如果并发请求的话,服务端相应返回的数据到了客户端你并不清楚其对应的位置,就会导致混乱,所以半双工在同一时间只能进行单向通信。而全双工通信相对而言就更为自由了,因为其在并发请求的时候每个请求都会有一个独一无二的序列号,服务端返回数据到客户端都能通过序列号一一对应,从而保障数据准确性。
全双工通信通道的搭建:
A.关键在于应用层协议需要有标记包号的字段
B.处理以下字段,需要有标记包长的字段
粘包
不完整包
C.错误处理
下面将前面半双工通道改造为全双工通道,如下:
客户端设立一个50ms的定时器,服务端设立一个随机一秒内的定时器,实现客户端和服务端全双工无序通信。
可以看到客户端会声明一个自增的序列号seq,在发包的时候会先插入seq进行标记,服务端拿到buffer后,会截取序列号seq,并插入到返回给客户端的包中,这样一来,客户端和服务端就可以实现无序的自由通信!