H5中为什么要有websocket

发布时间 2024-01-04 14:10:05作者: rain4414

在线网络游戏,是最重要的游戏形式,

通过互联网,玩家可以一起联网对战,能带来很多的乐趣。

H5微信小游戏,抖音小游戏怎么样做联网对战和传统的有什么不一样的?

 

首先我们来看传统的联网,我们直接用TCP socket,  H5的标准里面,我们用的是websocket,今天我们来说一说websocket 到底是什么。

 

TCP socket 的代价:

     TCP是可靠的传输协议,这个大家都知道,怎么实现可靠的呢?

就是发送端发送一个数据包,接收端回应收到后,再发送下一个,这个是由操作系统 底层来实现的, 这种处理逻辑,会带来一个问题,验证需要代价,底层想等多一点数据,一起发过去。这样会导致我们app 连续发送2个数据包的时候,这两个数据包,底层会有可能一起发出去,接收端会一起收到这2个数据包。

那么这个时候问题来了,对于app而言希望一个一个数据包处理,可是服务端收到了2个黏在一起的数据包,服务器程序也希望收到的是一个一个数据包,

但是实际却收到2个数据包,所以我们一般的做法,是app自己给这个数据包打上标识协议,根据协议方便把2个在一起的数据包分开。

App 做数据包的标识两种方式:

   (1)  数据大小size + 数据内容body + 校验;

   (2)  数据内容body + 特殊的标识符号(如\r\n);

 

当我们收到一个2个数据包在一起的时候,解析数据包里面的内容,

先读取第一个数据包的大小,读到数据后,根据大小可以定位下一个数据包的位置,依此类推。你使用TCP Socket ,每个里面都会有类似的协议;

  

H5 websocket:

   其实每次些拆包封包也挺蛮烦的,所以H5提出了一个标准解决方案,这个方法就是websocket。

    (1) websocket 底层基于TCP Socket

    (2) websocket 实现了4个协议(相当于自定义拆包,封包协议):

          连接握手协议;

          关闭协议;

          发送数据协议:   包头 + 数据内容;  

          接收数据协议:   包头 + 数据类容;

    

 这样得到得结果就是

    客户端使用websocket  与服务器的websocket来相连接, 客户端使用 ws 来发送数据,服务器,使用websocket协议来接收,接收到的就是用户完整的数据包。自己不用实现拆包,发送数据的时候也不要使用封包了,大大的减少了用户编写网络代码的难度。

 

Websocket = (TCP socket + 拆包,封包的一个协议)