H5中为什么要有websocket
在线网络游戏,是最重要的游戏形式,
通过互联网,玩家可以一起联网对战,能带来很多的乐趣。
H5微信小游戏,抖音小游戏怎么样做联网对战和传统的有什么不一样的?
首先我们来看传统的联网,我们直接用TCP socket, 而H5的标准里面,我们用的是websocket,今天我们来说一说websocket 到底是什么。
TCP socket 的代价:
TCP是可靠的传输协议,这个大家都知道,怎么实现可靠的呢?
就是发送端发送一个数据包,接收端回应收到后,再发送下一个,这个是由操作系统 底层来实现的, 这种处理逻辑,会带来一个问题,验证需要代价,底层想等多一点数据,一起发过去。这样会导致我们app 连续发送2个数据包的时候,这两个数据包,底层会有可能一起发出去,接收端会一起收到这2个数据包。
那么这个时候问题来了,对于app而言希望一个一个数据包处理,可是服务端收到了2个黏在一起的数据包,服务器程序也希望收到的是一个一个数据包,
但是实际却收到2个数据包,所以我们一般的做法,是app自己给这个数据包打上标识协议,根据协议方便把2个在一起的数据包分开。
App 做数据包的标识两种方式:
(1) 数据大小size + 数据内容body + 校验;
(2) 数据内容body + 特殊的标识符号(如 );
当我们收到一个2个数据包在一起的时候,解析数据包里面的内容,
先读取第一个数据包的大小,读到数据后,根据大小可以定位下一个数据包的位置,依此类推。你使用TCP Socket ,每个里面都会有类似的协议;
H5 的websocket:
其实每次些拆包封包也挺蛮烦的,所以H5提出了一个标准解决方案,这个方法就是websocket。
(1) websocket 底层基于TCP Socket
(2) websocket 实现了4个协议(相当于自定义拆包,封包协议):
连接握手协议;
关闭协议;
发送数据协议: 包头 + 数据内容;
接收数据协议: 包头 + 数据类容;
这样得到得结果就是
客户端使用websocket 与服务器的websocket来相连接, 客户端使用 ws 来发送数据,服务器,使用websocket协议来接收,接收到的就是用户完整的数据包。自己不用实现拆包,发送数据的时候也不要使用封包了,大大的减少了用户编写网络代码的难度。
Websocket = (TCP socket + 拆包,封包的一个协议)