react加入websocket

2023-11-14

1、首先创建一个公共的组件,封装websocket

代码如下

/**
 * 参数:[socketOpen|socketClose|socketMessage|socketError] = func,[socket连接成功时触发|连接关闭|发送消息|连接错误]
 * timeout:连接超时时间
 * @type {module.webSocket}
 */
module.exports =  class webSocket {
    constructor(param = {}) {
        this.param = param;
        this.reconnectCount = 0;
        this.socket = null;
        this.taskRemindInterval = null;
        this.isSucces=true;
    }
    connection = () => {
        let {socketUrl, timeout = 0} = this.param;
        // 检测当前浏览器是什么浏览器来决定用什么socket
        if ('WebSocket' in window) {
            console.log('WebSocket');
            
            this.socket = new WebSocket(socketUrl);
        }
        else if ('MozWebSocket' in window) {
            console.log('MozWebSocket');

            this.socket = new MozWebSocket(socketUrl);
        }
        else {
            console.log('SockJS');
            
            this.socket = new SockJS(socketUrl);
        }
        this.socket.onopen = this.onopen;
        this.socket.onmessage = this.onmessage;
        this.socket.onclose = this.onclose;
        this.socket.onerror = this.onerror;
        this.socket.sendMessage = this.sendMessage;
        this.socket.closeSocket = this.closeSocket;
        // 检测返回的状态码 如果socket.readyState不等于1则连接失败,关闭连接
        if(timeout) {
            let time = setTimeout(() => {
                 if(this.socket && this.socket.readyState !== 1) {
                     this.socket.close();
                 }
                 clearInterval(time);
            }, timeout);
        }
    };
    // 连接成功触发
    onopen = () => {
        let {socketOpen} = this.param;
        this.isSucces=false  //连接成功将标识符改为false
        socketOpen && socketOpen();
    };
    // 后端向前端推得数据
    onmessage = (msg) => {
        let {socketMessage} = this.param;
        socketMessage && socketMessage(msg);
        // 打印出后端推得数据
        console.log(msg);
    };
    // 关闭连接触发
    onclose = (e) => {
        this.isSucces=true   //关闭将标识符改为true
        console.log('关闭socket收到的数据');
        let {socketClose} = this.param;
        socketClose && socketClose(e);
        // 根据后端返回的状态码做操作
        // 我的项目是当前页面打开两个或者以上,就把当前以打开的socket关闭
        // 否则就20秒重连一次,直到重连成功为止 
        if(e.code=='4500'){
            this.socket.close();
        }else{
            this.taskRemindInterval = setInterval(()=>{
                if(this.isSucces){
                    this.connection();
                }else{
                    clearInterval(this.taskRemindInterval)
                }
            },20000)
        }
    };
    onerror = (e) => {
        // socket连接报错触发
        let {socketError} = this.param;
        this.socket = null;
        socketError && socketError(e);
    };
    sendMessage = (value) => {
        // 向后端发送数据
        if(this.socket) {
            this.socket.send(JSON.stringify(value));
        }
    };
};

2、在我们的react项目中引入这个公共的组件

import Socket from './index';


class websocket extends React.Component {
    constructor() {
        super();
        this.taskRemindInterval = null;
    }
    componentDidMount = () => {
        //    判断专家是否登录
        this.socket = new Socket({
            socketUrl: 'ws://123.207.167.163:9010/ajaxchattest',
            timeout: 5000,
            socketMessage: (receive) => {
                console.log(receive);  //后端返回的数据,渲染页面
            },
            socketClose: (msg) => {
                console.log(msg);
            },
            socketError: () => {
                console.log(this.state.taskStage + '连接建立失败');
            },
            socketOpen: () => {
                console.log('连接建立成功');
                // 心跳机制 定时向后端发数据
                this.taskRemindInterval = setInterval(() => {
                    this.socket.sendMessage({ "msgType": 0 })
                }, 30000)
            }
        });
     重试创建socket连接
        try {
            this.socket.connection();
        } catch (e) {
            // 捕获异常,防止js error
            // donothing
        }
    }

}

export default websocket;

 

转载于:https://www.cnblogs.com/houjl/p/10812519.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react加入websocket 的相关文章

  • 如何将udp发送到udp node.js服务器?

    我对此很陌生 所以我真的不知道我在做什么 但我已经设置了一个 node js udp 服务器 我想从客户端 来自网站 向它发送一个数据包 但我不知道如何在 javascript 中做到这一点 或者是否可能 我不是在研究如何从 Node js
  • 仅当表单已提交时才触发 jQuery 表单验证?

    不引人注目的验证基于这样的想法 don t进行表单验证 直到用户提交表单 一旦发生这种情况 如果表单上的某些内容无效 那么一旦用户更改了每个字段 就会立即验证它 我想做的是 不显眼地 触发表单元素的验证 也就是说 only如果用户已尝试提交
  • Angular 2 链式 Promise 并传递拒绝

    应该是一个简单的问题 但是我找不到有关如何做到这一点的文档 像这样链接一个承诺 Making a promise no problem let promise new Promise resolve reject gt let data d
  • 在Javascript中按降序对字符串进行排序(最有效)?

    W3Schools 有这个例子 var fruits Banana Orange Apple Mango fruits sort fruits reverse 这是在 Javascript 中按降序对字符串进行排序的最有效方法吗 Updat
  • 在网页上的文本框中键入内容时删除所有空格

    我如何在用户打字时即时删除输入到文本框中的空格 function var txt myTextbox var func function txt val txt val replace s g txt keyup func blur fun
  • Jquery从下拉列表中获取所选值的id

    我有一个下拉列表 可以从数据库获取值 如下所示 get getJobs function jobs seljobs jobs var i 0 jobs forEach function n alert job id n id 32 67 4
  • 使用 moment.js 检查输入日期是否为星期一

    好吧 我想检查日期是否是星期一 例如 var myDate new Date moment myDate DD MM YYYY dayIs monday 在我的国家 一周的第一天是星期一 所以 我真的想检查输入日期是否是一周的开始 我尝试使
  • jQuery 选择 # id 以单词为前缀,计数器为后缀

    有没有办法用 jQuery 选择所有带有前缀 my 和后缀 0 9 的 id 像这样的 my 1 4 还是可以用循环来实现 div div div div div div div div div div 第一个想法 似乎效果很好 div i
  • 通过 node-http-proxy 保留基于 cookie 的会话

    我有一个简单的基于 Express 的 Node js Web 服务器 用于开发 JavaScript 应用程序 我将服务器设置为使用 node http proxy 来代理应用程序向在不同域和端口上运行的 Jetty 服务器发出的 API
  • 如果链接包含特定文本,jQuery 将类添加到 href

    我的网站上的列表中有一些动态填充的链接 这些链接链接到文件 是否可以使用 jQuery 查看文件名是否以 pdf 结尾 并在 href 或类似的链接文本以 mp3 结尾时添加一个类 例如 我的列表中有以下链接 文件1 pdf 歌曲1 mp3
  • Typeahead.js substringMatcher 函数说明

    我只是在做一些研究Typeahead js这是一个非常酷的图书馆 感谢文档 我已经成功地获得了一个基本的示例 该文档也非常好 但是我试图弄清楚以下代码块实际上在做什么 var substringMatcher function strs r
  • JS用正则表达式替换数字

    我有元素的标识符 如下所示 form book 1 2 3 我想要的是用其他值替换该标识符中的第二个数字 我将函数 match 与以下正则表达式一起使用 var regexp d d d 但它返回我包含的数组 1 2 3 2 因此 当我尝试
  • 淡出和循环一组 div 的最佳方式

    假设我有以下 div div class a You are funny div div class b You are smart div div class c You are cool div 最好的展示方式是什么div a持续 5
  • Nodejs mysql 获取正确的时间戳格式

    我在用着mysqljs https github com mysqljs mysql得到结果后sql我变得不同TimeStamp格式如下 created at Sat Jul 16 2016 23 52 54 GMT 0430 IRDT 但
  • 数据表日期范围过滤器

    如何添加日期范围过滤器 like From To 我开始进行常规搜索和分页等工作 但我不知道如何制作日期范围过滤器 我正在使用数据表 1 10 11 版本 My code var oTable function callFilesTable
  • 如何在 Google 地图 V3 中创建编号地图标记?

    我正在制作一张上面有多个标记的地图 这些标记使用自定义图标 但我还想在顶部添加数字 我已经了解了如何使用旧版本的 API 来实现这一点 我怎样才能在V3中做到这一点 注意 当您将鼠标悬停在标记上时 标题 属性会创建一个工具提示 但我希望即使
  • 如何在 javascript 正则表达式中匹配平衡分隔符?

    我原以为这个问题是不可能的 据我所知 Javascript 的正则表达式既没有递归插值 也没有漂亮的 NET 平衡组功能 但问题就在那里 如问题 12 所示正则表达式 alf nu http regex alf nu 匹配平衡对 lt an
  • Jquery - 通过在字符串中构建 id 的 id 获取元素

    我在使用 jquery 元素时遇到问题 我正在 var 中构造名称 例如 var myId myGotId myId attr title changed myId 返回空 我想通过 id 获取我的元素 但动态构建我的 Id 连接字符串 编
  • 单击引导分页链接时调用 jquery 函数

    我想在单击引导分页链接时调用 jquery 函数 假设我想从第1页遍历到第2页 应该调用一个jquery函数 我正在使用以下代码 但它不起作用 ul pagination on click li function alert page ch
  • 单击列表时使用 bootstrap Dropdown 防止下拉菜单消失

    我正在使用使用引导下拉菜单 http twitter github com bootstrap javascript html dropdowns生成下拉菜单 我想防止点击菜单时菜单消失 我已经实现了以下代码 但它不起作用 知道如何修复它吗

随机推荐

  • 牛客网mysql刷题记录

    牛客网mysql刷题记录 SQL26 计算25岁以上和以下的用户数量 if expression A B select if age lt 25 or age is null 25岁以下 25岁及以上 as age cut count u
  • 云计算基础——期末大作业

    1 例举出目前云服务提供商最常用的云计算安全架 并说明其安全策略和安全机制 1 云计算安全框架中的模块组成及功能架构必须有图例说明 配以文字说明 2 云计算安全策略的一般应用的原则和针对性的问题 举例一个案例进行具体论述 3 云计算的安全机
  • 使用Python,OpenCV进行图像平移转换

    使用Python OpenCV进行图像平移转换 1 效果图 2 原理 3 源码 参考 这篇博客将介绍如何使用Python OpenCV对图像进行平移转换 平移是图像沿x轴和y轴的移动 使用平移 可以将图像上下左右移动 以及上述任意组合 要使
  • ESP8266引脚参考详解

    ESP8266引脚参考详解 ESP8266 ESP12 E芯片自带17个GPIO管脚 并不是所有的gpio在所有的ESP8266开发板中都是公开的 有些gpio不推荐使用 有些gpio有非常具体的功能 通过本指南 您将学习如何正确使用ESP
  • RxJava之PublishSubject、BehaviorSubject、ReplaySubject和AsyncSubject

    public class T2 subject 是一个神奇的对象 它可以是一个Observable同时也可以是一个Observer 它作为连接这两个世界的一座桥梁 一个主题可以订阅一个Observable 就像一个观察者 并且它可以发射新的
  • SpringBoot整合WebSocket实现后端向前端发送消息

    目录 一 什么是 websocket 接口 二 适用场景 三 示例代码 3 1 添加pom xml依赖 3 2 创建WebSokcet配置类 3 3 创建测试发送消息接口 3 4 测试webSocket http www jsons cn
  • C++三种计时方法pcl::console::TicToc

    目录 一 clock 二 gettimeofday 三 pcl console TicToc time Windows 10 VM Ware 16 Ubuntu 20 04 Ubuntu环境下测试了两种测量代码运行时间的函数 二者精度接近
  • bash: ip: command not found

    问题 想进入docker容器中ip addr查看ip地址 提示bash ip command not found 解决 bash ip command not found的主要原因是 当前环境下载Centos基础镜像只包含简单的操作系统 相
  • Android之 弹框总结

    一 简介 1 1 弹框即浮与页面之上的窗口 如键盘弹框 吐司弹框 确认弹框 下拉选择框 应用悬浮框等 1 2 弹框控件也很多 比如常用的Spinner Dialog Toast PopWindow等 以及新增的SnackBar Dialog
  • 如何使用Python中的异常处理机制来捕获和处理除零错误

    定义一个除法函数 用于演示异常处理 def divide x y try result x y except ZeroDivisionError print 错误 除数不能为零 else print 结果为 result finally p
  • 软件测试拿了几个20K offer,分享一波面经

    1 你的测试职业发展是什么 测试经验越多 测试能力越高 所以我的职业发展是需要时间积累的 一步步向着高级测试工程师奔去 而且我也有初步的职业规划 前3年积累测试经验 按如何做好测试工程师的要点去要求自己 不断更新自己改正自己 做好测试任务
  • llama/llama2论文解读

    llama 摘要 llama在约1 4T的token上 训练出参数量7B到65B的模型 其模型规模如下 在仅使用开源数据集的情况下 llama 13B在多数benchmarks上与GPT 3效果相当 llama 65B也与最好的模型 Chi
  • MySQL多表查询与事务的操作

    目录 1 表连接查询 1 1 多表查询的概念 1 2 内连接 1 3 外连接 2 子查询 3 事务 1 表连接查询 1 1 多表查询的概念 所需要的查询结果在多张不同的表中 因此需要用到多表查询 多表查询分为 内连接和外连接 内连接包含 隐
  • 二叉树遍历(递归实现前序/中序/后序遍历)

    1 准备工作 我们先定义一棵普通的二叉树 如下图 2 前序遍历 通过递归进行遍历 如果二叉树为空 则操作返回 如果非空 否则从根结点开始 然后遍历左子树 再遍历右子树 前序遍历的结果是 ABDGHEICFJK 为什么会遍历出这种结果 请看上
  • %d,%ld,%lld的区别

    在代码printf打印的时候我们经常会遇到 printf d xxx printf ld xxx printf lld xxx 那么在什么时候使用 d ld lld呢 d int ld long lld long long 在32位编译器上
  • k-means算法简介

    k means算法简介 文章目录 k means算法简介 一 什么是k means 二 k means算法的步骤 三 k means性能评估指标 四 k means的使用 4 1 相关API 4 2 具体案例 一 什么是k means 我们
  • 信息学奥赛一本通 1171:大整数的因子

    题目链接 http ybt ssoier cn 8088 problem show php pid 1171 思路 大整数挨个除以 2 9 2 sim 9 2 9 判断余数是否为 0
  • PatchMatchNet 学习笔记 译文 深度学习三维重建

    9 PatchMatchNet CVPR 2021 patchmatchnet源码下载 PatchMatchNet 代码注释版 下载链接 注释非常详细 较源码结构有调整 使用起来更方便 PatchMatchNet CVPR 2021 源码
  • Web的基本漏洞--任意文件读取与下载漏洞

    目录 一 任意文件读取漏洞介绍 1 任意文件读取漏洞原理 2 任意文件读取漏洞产生的原因 3 任意文件读取漏洞探测与危害 二 任意文件下载漏洞介绍 1 任意文件下载漏洞原理 2 漏洞产生原因 3 文件下载的两种方式 三 常见的敏感文件 Wi
  • react加入websocket

    1 首先创建一个公共的组件 封装websocket 代码如下 参数 socketOpen socketClose socketMessage socketError func socket连接成功时触发 连接关闭 发送消息 连接错误 tim