当前位置: 首页 > news >正文

React开发一个WebSocket

export default class SocketService {static instance = null;static get Instance() {if (!this.instance) {this.instance = new SocketService();}return this.instance;}// 和服务端连接的socket对象ws = null;// 存储回调函数callBackMapping = {};// 标识是否连接成功connected = false;// 记录重试的次数sendRetryCount = 0;// 重新连接尝试的次数connectRetryCount = 0;//  定义连接服务器的方法close() {if (this.ws !== null){this.ws.close();}}connect() {// 连接服务器if (!window.WebSocket) {return console.log('您的浏览器不支持WebSocket');}let url = `wss://${location.host}/screen_ws`;this.ws = new WebSocket(url);// 连接成功的事件this.ws.onopen = () => {// console.log('连接服务端成功了');this.connected = true;// 重置重新连接的次数this.connectRetryCount = 0;let classSocket = localStorage.getItem('classSocket');setTimeout(() => {this.send(classSocket);}, 600);};// 1.连接服务端失败// 2.当连接成功之后, 服务器关闭的情况this.ws.onclose = () => {console.log('连接服务端失败');this.connected = false;this.connectRetryCount++;setTimeout(() => {this.connect();}, 500 * this.connectRetryCount);};// 得到服务端发送过来的数据this.ws.onmessage = (evt) => {const res = evt.data;var arrall = [];var arr = res.split('{"cmd_code"');//  console.log(arr);if (arr.length>0){arr.forEach(element => {if (element){let arr = elementarrall.push(JSON.parse('{"cmd_code"'+arr));}});}arrall.forEach(item1=>{const socketType = item1.message_type;// console.log(socketType);// console.log(item1);if (this.callBackMapping[socketType]) {// const realData = msg.data // 得到该图表的数据this.callBackMapping[socketType].call(this,item1)}})};}// 回调函数的注册registerCallBack(socketType, callBack) {this.callBackMapping[socketType] = callBack;}// 取消某一个回调函数unRegisterCallBack(socketType) {delete this.callBackMapping[socketType];}// 发送数据的方法send(data) {if (this.connected) {this.sendRetryCount = 0;try {this.ws.send(data);} catch (e) {console.error('Failed to send data:', e);// 这里不再重试发送,因为 WebSocket 可能已经关闭或不可用// 可以考虑设置一个错误处理回调或执行其他错误恢复策略}} else {if (this.sendRetryCount < MAX_RETRY_COUNT) { // 假设 MAX_RETRY_COUNT 是一个定义好的最大重试次数this.sendRetryCount++;setTimeout(() => {this.send(data);}, this.sendRetryCount * 500);} else {console.error('Max retry count reached. Giving up sending data:', data);// 处理达到最大重试次数的情况,比如记录日志、触发错误处理回调等}}
}
}

请注意,我添加了一个 `MAX_RETRY_COUNT` 常量来表示最大重试次数,并在达到这个次数时停止重试。同时,我也移除了 `catch` 块中的重复发送逻辑,并添加了适当的错误处理。

http://www.lryc.cn/news/465151.html

相关文章:

  • Oracle DECODE 丢失时间精度的原因与解决方案
  • 如何用示波器检测次级点火系统(一)
  • 基于SpringBoot+Vue+uniapp的涪陵区特色农产品交易系统的详细设计和实现(源码+lw+部署文档+讲解等)
  • bmp怎么转换为jpg?快速批量将bmp转换为jpg
  • centos8配置java环境变量jdk8u422-b05
  • 基于SSM的校园拓展活动管理系统
  • Python随机森林算法详解与案例实现
  • 提示词高级阶段学习day2.1-在提示词编写中对{}的使用教程
  • 2024年,每一个大模型都躲不过容嬷嬷和紫薇
  • SpringBoot之RedisTemplate基本配置
  • SparseRCNN 模型,用于目标检测任务
  • 【AIGC】第一性原理下的ChatGPT提示词Prompt设计:系统信息与用户信息的深度融合
  • DeepSpeed性能调优与常见问题解决方案
  • 【GESP】C++一级练习BCQM3052,鸡兔同笼
  • Android面试之5个性能优化相关的深度面试题
  • R语言机器学习算法实战系列(六)K-邻近算法 (K-Nearest Neighbors)
  • FPGA图像处理之构建3×3矩阵
  • 【Linux】进程间通信(匿名管道)
  • memset()函数的实现
  • STM32CUBEIDE FreeRTOS操作教程(七):queue队列
  • 类型转换与字符串操作:数据的灵活变形!
  • 动态规划18:188. 买卖股票的最佳时机 IV
  • YOLOv8改进 - 注意力篇 - 引入ShuffleAttention注意力机制
  • 基于Multisim的8路彩灯循环控制电路设计与仿真
  • 完整的模型训练套路 pytorch
  • 2024年十大前沿图像分割模型汇总:工作机制、优点和缺点介绍
  • Notepad++将搜索内容所在行选中,并进行复制等操作
  • [Java EE] IP 协议 | NAT 机制 | 路由选择 | MAC 地址 | 域名解析服务
  • 赋能特大城市水务数据安全高速运算,深圳计算科学研究院YashanDB数据库系统斩获“鼎新杯”二等奖
  • RAYDATA链接PGSQL做图表