博毅创为Alan老师

导航

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 + 拆包,封包的一个协议)

posted on 2021-08-03 10:24  游戏开发阿博  阅读(139)  评论(0编辑  收藏  举报