JavaScript 踩坑 WebSocket

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

踩坑1:websocket异步执行导致执行多次

目的:
想编写一个websocket自动重连功能
方法:
当连接断开时,利用.onclose创建定时任务,定时尝试创建websocket连接。
异常现象:
定时任务间隔在2秒以内,当网络通畅后,最后有多个websocket同时建立。
原因:
定时任务创建websocket是异步执行,但没有在任务内判断上一个websocket重连是否已执行结束。
websocket异步导致任务执行后没有立即尝试连接websocket,而是等了2秒多才执行,推迟到了下一个2秒后的定时任务执行周期内,导致最后网络畅通时多个websocket都尝试创建并成功。
解决:
尝试重连的任务内使用options.ws.readyState判断上次尝试是否结束且失败。
正常代码:

// 初始化
Usocket.prototype.init = function() {
    let options = this.options; // 此方法所属类的属性,当做普通对象变量即可。
    if ( 'WebSocket' in window) {
        let heartbeat_id = undefined;
        let offline_recover_id = undefined;
        let create_socket = () => { // 创建websocket连接的匿名函数
            console.log("执行create_socket");
            options.ws = new WebSocket(options.socket_url);
            options.ws.onopen = () => {
                console.log("已建立连接");
                if (offline_recover_id === undefined) {
                    console.log("断线重连未开启");
                } else {
                    clearInterval(offline_recover_id);
                    offline_recover_id = undefined;
                }
                // 定时心跳
                let heartbeat_i = 0;
                heartbeat_id = setInterval(function () {
                    console.log("心跳包发送:" + heartbeat_i++);
                    options.ws.send("");
                }, options.heartbeat_time);
                options.onopen();
            };
            options.ws.onmessage = options.onmessage;
            options.ws.onclose = () => {
                clearInterval(heartbeat_id);
                options.onclose();
                if (offline_recover_id === undefined) {
                    console.log("创建offline_recover_id");
                    offline_recover_id = setInterval(function () {
                        console.log("开始执行定时器函数");
                        if (options.ws.readyState == options.ws.CLOSED) {
                            create_socket();
                        } else {
                            console.log("ws未关闭,本次不执行重连");
                        }
                    }, options.offline_recover_time);
                }
            }
            options.ws.onerror = () => {
                options.onerror;
            }
        };
        create_socket();
    } else {
        console.log('您的浏览器不支持WebSocket');
    }
};

踩坑2:同一浏览器内,websocket后的alert会阻塞其他页面的js执行

测试了websocket.onmessage接收消息,setInterval任务,估计是阻塞全浏览器js。
测试代码:文章来源地址https://www.toymoban.com/news/detail-412830.html

<html>
   <script type="text/javascript">
   if ( 'WebSocket' in window) {
      var ws = new WebSocket("ws://127.0.0.1:2000");
      
      console.log(".onopen设置前");
      ws.onopen = function()
      {
         // ws.send("js的webscoket数据");
         console.log("执行.onopen,scoket开始建立连接...");
      };
      console.log(".onopen设置后");
      
      ws.onmessage = function (evt)
      {
         var received_msg = evt.data;
         console.log('js接收到:'+received_msg);
         alert('js接收到:'+received_msg); // 此行会触发alert阻塞其他页面js,也可用于打开多个此页面时来验证阻塞(此页面A触发时,此页面B被阻塞)
      };
      
      ws.onclose = function()
      {
         alert('close');
         console.log("连已关闭...");
      };
      
      setInterval(function () {
         console.log("心跳包发送");
         ws.send("");  
      }, 5000);
      setInterval(function () { // 此行测试阻塞setInterval
      let a  = 0;
         console.log(a++);
      })
   } else {
      alert('您的浏览器不支持WebSocket');
   }
   function test_webSocket()
   {
      let user = {
         'username' : 'xiaoming',
         'key' : 'zdkj-123456',
         'action' : 'broadcast',
         'data' : {
            'msg' : 'js广播测试数据'
         }
      };
      // ws.send("js的webscoket数据");
      //console.log(JSON.stringify(user));
      ws.send(JSON.stringify(user));         
   }
   </script>
   <body>
      <div id="">
         <a href="javascript:test_webSocket()">发送 WebSocket请求</a>
      </div>
   </body>
</html>

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

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

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

相关文章

  • Web APIs JavaScript执行机制与异步编程模型

    探索JavaScript的执行机制,包括同步与异步任务的处理方式,以及常见的事件循环机制,助您更深入理解JavaScript编程模型。

    2024年02月21日
    浏览(40)
  • JavaScript编程技巧:将异步方法转换为同步执行的实用方法

    当在JavaScript中处理异步操作时,我们通常会使用 async/await 来简化异步代码的编写和理解。然而,有时候我们可能需要将异步方法转换为同步执行的方法,以满足特定的需求。在本篇博客中,我们将详细讨论如何将异步方法转换为同步执行的方法。 异步方法的主要特点是非阻

    2024年02月08日
    浏览(48)
  • Java21 + SpringBoot3使用spring-websocket时执行mvn package报错

    近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展来完成自己的功能开发。 本项目为前后端分离开发,后端基于 Java21 和 SpringBoot3 开发,前端提供了vue、angular、react、uniap

    2024年02月02日
    浏览(69)
  • javascript二维数组(21)执行异步HTTP(Ajax)请求的方法($.get、$.post、$getJSON、$ajax)

    . g e t 、 .get、 . g e t 、 .post、 g e t J S O N 、 getJSON、 g e t J SON 、 ajax都是jQuery提供的用于执行异步HTTP(Ajax)请求的方法。每个方法都有其特定的用途和区别。 . g e t :这个方法使用 G E T 方式来进行异步请求。其语法结构为: .get:这个方法使用GET方式来进行异步请求。其语

    2024年02月07日
    浏览(53)
  • 【异常】IDEA中执行单元测试后提示IllegalStateException: javax.websocket.server.ServerContainer not available

    在SpringBoot项目中集成了WebSocket,在进行单元测试的时候,出现了以下错误: 代码中使用了POM文件spring-boot-starter-websocket,用于统计实时人数 单元测试类的原注解是这样的: 经查阅资料,得知SpringBootTest在启动的时候不会启动服务器,所以WebSocket自然会报错 这个时候需要添加

    2024年02月04日
    浏览(44)
  • webSocket前端+webSocket封装

    一、websocket基础 2.使用(vue)

    2024年02月15日
    浏览(41)
  • 【websocket】websocket-client 与 websockets

    websocket-client 是 websocket 客户端,提供了对ws低级API的访问。通过导入 websocket 库使用,websocket 库是基于事件驱动的设计模式,通过定义回调函数来处理接收到的消息、错误和连接关闭等事件。 优势: 兼容多个 Python 版本,包括 Python 2.7 和 Python 3.x。 简单易用,入门门槛较低。

    2024年02月12日
    浏览(40)
  • SpringBoot集成websocket(3)|(websocket调用websocket采用回调方式实现数据互传)

    章节 第一章链接: SpringBoot集成websocket(1)|(websocket客户端实现) 第二章链接: SpringBoot集成websocket(2)|(websocket服务端实现以及websocket中转实现) 本节主要介绍的是springboot实现websocket的客户端服务端,以及客户端与服务端的数据互传。以下为伪代码,业务逻辑删除导致不

    2024年02月12日
    浏览(51)
  • 【WebSocket】前端使用WebSocket实时通信

    最近写项目,需要实现消息通知和实时聊天的功能,就去了解了一些关于websocket的知识,总结如下。 WebSocket 是一种在 Web 应用中实现实时通信的协议。与传统的 HTTP 请求不同,WebSocket 连接在客户端和服务器之间建立一个 持久性 的 双向通信管道 ,使得数据可以在连接打开后

    2024年02月11日
    浏览(34)
  • WebSocket 是什么?WebSocket 前后端交互

    WebSocket是一种在Web浏览器和服务器之间建立实时双向通信的技术。它不同于HTTP协议,因为HTTP是单向协议,只能客户端向服务器发送请求,服务器才能响应请求。而 WebSocket可以实现双向通信 ,客户端和服务器可以随时互相发送消息,无需等待请求和响应。 WebSocket 协议是 HT

    2024年02月08日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包