websocket以及心跳机制的实现

这篇具有很好参考价值的文章主要介绍了websocket以及心跳机制的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#为什么要使用websocket

        在浏览器与服务器通信之间,传统的http请求在某些场景下并不理想,比如实时聊天,实时性的小游戏等等,

其中面临主要的两个缺点:

  • 无法做到消息的实时性

  • 服务器无法主动推送信息

其基于http的主要解决方案有:

  • 基于ajax的轮询:客户端定时或者动态相隔短时间内不断向服务器请求接口,询问服务器是否有新信息;其缺点也很明显;多余的空请求(浪费资源)、数据获取有延时;

  • Long poll(长轮询):其中采用的是阻塞性的方案,客户端向服务器发起ajax请求,服务器挂起该请求不返回数据直接有新的数据,客户端接收到数据之后再次执行long poll;该方案中每个请求都挂起了服务器,在大量连接的场景下是不可以接收的

可以看到,基于 HTTP 协议的方案都包含一个本质缺陷 —— 「被动性」,服务端无法下推消息,仅能由客户端发起请求不断询问是否有新的消息,同时对于客户端与服务端都存在性能消耗。

WebSocket 是 HTML5 开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 WebSocket 通信协议于2011年被IETF定为标准RFC 6455,WebSocketAPI 被 W3C 定为标准。 在 WebSocket API 中,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

WebSocket 是 HTML5 中提出的新的网络协议标准,其包含几个特点:

  • 建立于 TCP 协议之上的应用层;

  • 一旦建立连接(直到断开或者出错),服务端与客户端握手后则一直保持连接状态,是持久化连接;

  • 服务端可通过实时通道主动下发消息;

  • 数据接收的「实时性(相对)」与「时序性」;

  • 较少的控制开销。连接创建后,ws客户端、服务端进行数据交换时,协议控制的数据包头部较小。在不包含头部的情况下,服务端到客户端的包头只有2~10字节(取决于数据包长度),客户端到服务端的的话,需要加上额外的4字节的掩码。而HTTP协议每次通信都需要携带完整的头部。

  • 支持扩展。ws协议定义了扩展,用户可以扩展协议,或者实现自定义的子协议。(比如支持自定义压缩算法等)

  # 为什么要使用心跳机制呢

        遇到的问题:

                实时聊天过程中,

  1.  websocket连接后,长时间远端和客户端不发消息,服务端会把websocket给断开;
  2. 所以就需要一种机制来检测客户端和服务端是否处于正常的链接状态。
  3. 因此就有了websocket的‘心跳监测’。
  4. 还有心跳,说明还活着,没有心跳说明已经断开了。

        关于websocket的心跳重连机制

  1. 心跳机制是每隔一段时间会向服务器发送一个数据包:

    告诉服务器(后台)自己还活着,同时客户端(浏览器)会 确认服务器端是否还活着

  2. 如果还活着的话,就会回传一个数据包给客户端
  3. 服务端断开连接了。客户端需要重连~

webscoket导致的兼容问题 可以用短轮询和长轮询代替,对浏览器的版本兼容性考虑

        判断浏览器的版本,可以使用navigator对象的userAgent属性来获取浏览器的信息。userAgent属性返回一个字符串,其中包含了浏览器的版本信息。

    那么如何进行判断呢

        以下就是个案例

let browser = ""; // 存储浏览器名称

// 判断浏览器类型
if (userAgent.indexOf("msie") > -1 || userAgent.indexOf("trident") > -1) {
  browser = "IE";
} else if (userAgent.indexOf("firefox") > -1) {
  browser = "Firefox";
} else if (userAgent.indexOf("chrome") > -1 && userAgent.indexOf("edge") === -1) {
  browser = "Chrome";
} else if (userAgent.indexOf("safari") > -1 && userAgent.indexOf("chrome") === -1) {
  browser = "Safari";
} else if (userAgent.indexOf("edge") > -1) {
  browser = "Edge";
}

// 判断浏览器版本
let version;
switch (browser) {
  case "IE":
    version = userAgent.match(/(?:msie|rv:)\s?([\d.]+)/)[1]; // 匹配IE浏览器的版本
    break;
  case "Firefox":
    version = userAgent.match(/firefox\/([\d.]+)/)[1]; // 匹配Firefox浏览器的版本
    break;
  case "Chrome":
    version = userAgent.match(/chrome\/([\d.]+)/)[1]; // 匹配Chrome浏览器的版本
    break;
  case "Safari":
    version = userAgent.match(/version\/([\d.]+)/)[1]; // 匹配Safari浏览器的版本
    break;
  case "Edge":
    version = userAgent.match(/edge\/([\d.]+)/)[1]; // 匹配Edge浏览器的版本
    break;
}

// 进行兼容性判断
if (browser === "IE" && version < 10) {
  // IE浏览器版本低于10
  alert("您当前使用的浏览器版本过低,请升级!");
} else {
  // 执行其他操作
  console.log(`当前浏览器为${browser},版本号为${version}`);
}
短轮询

        短轮询是通过HTTP请求来获取服务器数据,通常是固定的时间间隔发送请求,比如每隔5秒发送一次请求获取最新数据。在Vue3中,我们可以通过使用axios库来实现短轮询,代码如下:

export default {
  data() {
    return {
      data: []
    }
  },
  mounted() {
    this.interval = setInterval(() => {
      axios.get('/api/getData').then(res => {
        this.data = res.data
      })
    }, 5000)
  },
  beforeUnmount() {
    clearInterval(this.interval)
  }
}
长轮询  

长轮询是通过HTTP请求来获取服务器数据,但该请求会一直保持连接状态,直到服务器端有数据更新或者超时才会返回数据。在Vue3中,我们可以通过使用axios库实现长轮询,代码如下:

export default {
  data() {
    return {
      data: []
    }
  },
  async mounted() {
    while (true) {
      try {
        const res = await axios.get('/api/getData', {
          timeout: 60000 // 设置超时时间
        })
        this.data = res.data
      } catch (err) {
        console.error(err)
      }
    }
  }
}

这里通过使用while循环来保持连接状态,使用axios库发送get请求获取最新数据。在请求失败或超时后进行异常处理,可以避免程序崩溃。需要注意的是,长轮询需要设置超时时间,否则可能会导致资源耗尽。文章来源地址https://www.toymoban.com/news/detail-762932.html

到了这里,关于websocket以及心跳机制的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WebSocket心跳机制

    WebSocket是HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。 1、创建webSocket 2、websocket事件 事件 事件处理程序 描述 open Socket.onopen 连接建立时触发

    2024年02月15日
    浏览(56)
  • WebSocket心跳机制(笔记大全)

    一、WebSocket心跳机制前端 前端实现WebSocket心跳机制的方式主要有两种: 使用setInterval定时发送心跳包。 在前端监听到WebSocket的onclose()事件时,重新创建WebSocket连接。 第一种方式会对服务器造成很大的压力,因为即使WebSocket连接正常,也要定时发送心跳包,从而消耗服务器资

    2024年02月15日
    浏览(42)
  • websocket 心跳机制

    WebSocket 是一种在客户端和服务器之间创建持久连接的技术。为了保持连接的稳定性,就需要通过发送心跳消息来维持 WebSocket 连接。 1、创建一个webscoket基本的使用 2、在客户端连接到 WebSocket 服务器之后,通过 setInterval 方法定时发送心跳消息 这边的代码会每隔5秒向服务器发

    2024年02月11日
    浏览(39)
  • WebSocket断开原因和心跳机制

    WebSocket断开的原因有很多,最好在WebSocket断开时,将错误打印出来。 错误状态码: WebSocket断开时,会触发CloseEvent, CloseEvent会在连接关闭时发送给使用 WebSockets 的客户端. 它在 WebSocket 对象的 onclose 事件监听器中使用。CloseEvent的code字段表示了WebSocket断开的原因。可以从该字段

    2024年02月04日
    浏览(48)
  • uniapp websocket机制 心跳 重连

    在开发程序过程中通信功能还是比较常用到的,本文主要介绍的是uniapp中websocket的使用 websocket建立连接后,断开、心跳机制重新链接的一个过程。 关于uni.connectSocket可仔细阅读uniapp官网中的uni.connetSocket以及连接socket创建的实例 SocketTask   具体代码如下:内有代码详细注解,

    2024年02月12日
    浏览(38)
  • WebSocket的心跳机制和断线重连

    在服务器重启或是弱网情况下,前端不能保证一直连接成功。因此在出现被动断开的情况下,需要有 心跳机制 和 断线重连 的功能。 心跳机制 :客户端每隔一段时间向服务端发送一个特有的心跳消息,每次服务端收到消息后只需将消息返回,此时,若二者还保持连接,则客

    2024年01月18日
    浏览(43)
  • WebSocket心跳检测和重连机制

    心跳和重连的目的用一句话概括就是客户端和服务端保证彼此还活着,避免丢包发生。 websocket 连接断开有以下两证情况: 前端断开 在使用 websocket 过程中,可能会出现网络断开的情况,比如信号不好,或者网络临时关闭,这时候websocket的连接已经断开,而不同浏览器有不同

    2024年01月21日
    浏览(39)
  • websocket的基础使用,心跳机制,断线重连

    websoket出现的原因: 传统的http请求只能是由前端向后台发送一个请求,然后后台把结果返回给前端,前端再进行展示。这里就暴露了一个问题,就是通信只能由前端发起,而后台无法主动与前端通信。而websoket的出现就是为了解决这个问题,让前端可以主动联系后台,后台也

    2024年02月06日
    浏览(46)
  • WebSocket实战之六心跳重连机制

    WebSocket应用部署到生产环境,我们除了会碰到因为经过代理服务器无法连接的问题(注:该问题可以通过搭建WSS来解决,具体配置请看 WebSocket实战之四WSS配置 ),另外一个问题就是外网环境不稳定经常会断开或者服务器重启或者网络中间服务器当发现一个长连接长时间没有

    2024年02月07日
    浏览(46)
  • uniapp使用WebSocket断线,心跳重连机制

    提示:我们在使用WebSocket,经常会遇到有的时候给别人发消息,别人会接收不到,这个时候就有可能是WebSocket断线了,所以这个时候心跳包就出现了 提示:可直接使用,记得把对应地址替换一下

    2024年04月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包