首页 > 其他分享 >H5中为什么要有websocket

H5中为什么要有websocket

时间:2024-01-04 14:11:49浏览次数:23  
标签:为什么 websocket 协议 TCP H5 收到 数据包

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

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

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

 

 

标签:为什么,websocket,协议,TCP,H5,收到,数据包
From: https://www.cnblogs.com/rainy1unity/p/17945120

相关文章

  • 记录H5中使用手机端摄像头拍照存储Base64格式图片
    前面把openssl配置好了,现在在手机端就可以输入https://ip:port访问我的应用客户端了,今天在测试的过程中发现一些问题。问题一:手机端点开后发现是前置摄像头。需要加个video的配置项,facingMode:{exact:"environment"} 这个加了之后,在pc端打开摄像头就会报错,暂时只能在手机上调......
  • uniapp:全局消息是推送,实现app在线更新,WebSocket,apk上传
    全局消息是推送,实现app在线更新,WebSocket1.在main.js中定义全局的WebSocket2.java后端建立和发送WebSocket3.通知所有用户更新背景:开发人员开发后app后打包成.apk文件,上传后通知厂区在线用户更新app。那么没在线的怎么办?因为我们在上一篇博客中写了,在app打开的时候回去校验是否......
  • uniapp:实现手机端APP登录强制更新,从本地服务器下载新的apk更新,并使用WebSocket,实时强
    实现登录即更新,或实时监听更新本文介绍的是在App打开启动的时候调用更新,点击下方链接,查看使用WebSocket实现实时通知在线用户更新。uniapp:全局消息是推送,实现app在线更新,WebSocket,apk上传:登录更新流程1.在app每次启动的时候请求java后端,2.后端接口获取最新的版本:3.打开更新页面4......
  • 为什么要对服务器进行维护
    我们在日常使用服务器的过程中,经常会遇到死机,卡顿等等,那么该怎么做才能避免出现类似情况。为了确保服务器的正常运行和企业的顺利运营,定期进行服务器维护是必要的。服务器日常维护可以提高性能、保障安全、保持稳定性、延长使用寿命、降低成本、提高服务质量、提升数据安全、支持业......
  • 15.明明是x86的sos为什么会报不是有效的Win32应用程序
    最近在分析一个dump的时候,遇到了%1不是有效的Win32应用程序。这个错误,输出如下:*************Pathvalidationsummary**************ResponseTime(ms)LocationDeferredSRV*C:\mysymbols*http://msdl......
  • 内存溢出为什么不会被捕获到
    内存溢出(OutofMemory)是指程序在申请内存时,没有足够的内存供其使用,导致无法继续执行的情况。一般来说,内存溢出会导致程序抛出OutOfMemoryError错误,而不是被捕获到。OutOfMemoryError是Error的子类,而不是Exception的子类。在Java中,Error类型的错误通常表示严重问题,例如内......
  • 什么是数据销毁,为什么数据销毁很重要
    当大多数人听到“数据破坏”时,他们的脸上都会表现出恐惧的表情。世界上大多数人最不想要的就是销毁他们计算机或移动设备上的数据。但现实情况是,无论您是大型、中型还是小型企业的所有者,总有一天您需要移除或更换旧媒体,并且您需要确保存储在该媒体上的所有数据都已删除且不可恢复.......
  • 为什么Android系统开发工程师这么稀缺?
    前言今日得闲,思考了一个问题。为什么Android系统开发工程师各个公司都在招聘,而且是每天都在招,工资待遇也很客观,但结果却找不到人?首先,我们来看下Android系统开发工程师的主要职责是什么,以下是招聘网的要求。根据以上要求,我们来分析一下:本科学历,这个要求目前基本上都可以满足,再高一点......
  • OpenEuler【NetworkManager】为什么ifcfg-ethX网卡配置文件修改后不生
    1问题现象修改/etc/sysconfig/network-scripts/ifcfg-ethX网卡配置文件中的ip地址后,重启NetworkManager服务,网卡ip未生效2问题原因在不重启系统的情况下,仅重启NetworkManager服务,它不会重新读取/etc/sysconfig/network-scripts/目录下的网卡配置文件并生效。可以通过以下几......
  • 嘉为蓝鲸张敏:运维体系为什么要基于平台化建设
    摘要:笔者根据自身的技术和行业理解,解析运维平台化的内涵和实践。涉及关键词:一体化运维、平台化运维、数智化运维、运维PaaS、运维架构治理、蓝鲸等。本文作者:嘉为蓝鲸运维产品及解决方案负责人张敏全文共计5500字,预计阅读时间12min。01运维平台的概念被泛化近几年行业发展和客户实......