socket连接封装

embedded/2024/11/23 17:59:34/

效果:
在这里插入图片描述

class websocketMessage {constructor(params) {this.params = params; // 传入的参数this.socket = null;this.lockReconnect = false; // 重连的锁this.socketTimer = null; // 心跳this.lockTimer = null; // 重连this.timeout = 3000; // 发送消息this.callbacks = []; // 存储外部的回调函数// this.init(); // websocket 初始化}/*** @description: websocket 初始化* @return {*}*/init() {if (!("WebSocket" in window)) {console.warn("当前浏览器不支持 WebSocket");return;}this.lockReconnect = false;this.socket = new WebSocket(this.params.ws);this.socket.onopen = this.open.bind(this);this.socket.onmessage = this.onMessage.bind(this);this.socket.onerror = this.error.bind(this);// this.socket.onclose = this.close.bind(this);}/*** @description: websocket 已连接* @return {*}*/open() {console.log(`${this.params.ws}:WebSocket已连接。`);}/*** @description: 监听接收消息* @param {*} event* @return {*}*/onMessage({data}) {// 判断是否开启心跳if (this.params.heart) {this.socketTimer && clearTimeout(this.socketTimer);this.socketTimer = setTimeout(() => {this.socket.send(JSON.stringify(this.params.heart.data));}, 3000);}// 如果开启心跳,过滤掉心跳的数据if (data === this.params?.heart?.data) {return;}// 将消息传递给所有注册的回调函数this.callbacks.forEach((callback) => callback(typeof data === 'string' ? data : JSON.parse(data)));}/*** @description: 注册消息回调函数* @param {*} callback 回调函数* @return {*}*/message(callback) {if (typeof callback === "function") {this.callbacks.push(callback);} else {console.warn("注册的回调必须是一个函数");}}/*** @description: 发送消息* @param {*} msg* @return {*}*/send(msg) {if (!this.socket) {return;}let timer = null;clearTimeout(timer);timer = setTimeout(() => {if (this.socket?.readyState === 1) {this.socket.send(JSON.stringify(msg));clearTimeout(timer);} else {this.send(msg);}}, 50);}/*** @description: 连接发送错误的时候,输出信息* @param {*} e 错误消息* @return {*}*/error(e) {this.socket = null;console.log(`${this.params.ws}:WebSocket正在重新连接`, e);this.reconnect();}/*** @description: 关闭 websocket 连接* @return {*}*/close() {this.socket = null;this.lockReconnect = true;this.callbacks = []; // 清除回调clearTimeout(this.lockTimer);clearTimeout(this.socketTimer);this.socket?.onclose();console.log(`${this.params.ws}:WebSocket连接已关闭`);}/*** @description: 重新连接 websocket* @return {*}*/reconnect() {if (this.lockReconnect) {return;}this.lockReconnect = true;clearTimeout(this.lockTimer);this.lockTimer = setTimeout(() => {this.init();}, this.timeout);}
}// 调用:
let socket = new websocketMessage({ws: "wss://toolin.cn/echo",
});socket.init();// 注册消息处理回调
socket.message((data) => {console.log("接收到的消息:", data);
});// 发送登录消息
socket.send({type: "login",data: {userId: "123",},
});
setTimeout(() => {// 发送登录消息socket.send({type: "sadfasd",data: {userId: "sadf",},});
}, 5000)
setTimeout(() => {// 发送登录消息socket.send({type: "20000",data: {userId: "2",},});
}, 2000)

http://www.ppmy.cn/embedded/139905.html

相关文章

基于uniapp开发的微信H5图片上传压缩

安装Compressor&#xff0c;并在页面引入 npm i compressorjs import Compressor from "compressorjs" 具体使用代码 H5部分&#xff1a; <view class"h5upload" click"add"><view class""></view><view cla…

如何在 React 项目中应用 TypeScript?应该注意那些点?结合实际项目示例及代码进行讲解!

在 React 项目中应用 TypeScript 是提升开发效率、增强代码可维护性和可读性的好方法。TypeScript 提供了静态类型检查、自动补全和代码提示等功能&#xff0c;这对于 React 开发者来说&#xff0c;能够帮助早期发现潜在的 bug&#xff0c;提高开发体验。 1. 项目初始化 在现…

排序算法(四)--快速排序

文章目录 引言快速排序的基本原理C语言实现快速排序代码解析 快速排序 C语言实例 引言 快速排序&#xff08;Quicksort&#xff09;作为一种高效的排序算法&#xff0c;以其平均时间复杂度为O(n log n)而著称。 快速排序的基本原理 快速排序的核心思想是分治法&#xff08;D…

一站式学习:害虫识别与分类图像分割

1.背景意义 研究背景与意义 随着全球气候变化和人类活动的加剧&#xff0c;害虫的种类和数量不断增加&#xff0c;给农业、生态环境和公共卫生带来了严重威胁。害虫不仅会直接损害农作物&#xff0c;导致经济损失&#xff0c;还可能传播疾病&#xff0c;影响人类健康。因此&a…

20241121 android中树结构列表(使用recyclerView实现)

1、adapter-item的布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"wrap_content&…

30. 并发编程

一、什么是多任务 如果一个操作系统上同时运行了多个程序&#xff0c;那么称这个操作系统就是 多任务的操作系统&#xff0c;例如&#xff1a;Windows、Mac、Android、IOS、Harmony 等。如果是一个程序&#xff0c;它可以同时执行多个事情&#xff0c;那么就称为 多任务的程序。…

react中Fragment的使用场景

在 React 中&#xff0c;Fragment 是一个非常有用的组件&#xff0c;允许你将多个子元素包裹在一起&#xff0c;而不会在 DOM 中产生额外的节点。它通常用于以下几个场景&#xff1a; import React, {Fragment} from react; 1. 返回多个子元素而不添加额外的 DOM 元素&#x…

MVC 模型:架构与原理

MVC 模型:架构与原理 MVC(Model-View-Controller)模型是一种广泛应用于软件工程的架构模式,主要用于分离应用程序的逻辑层,以提高其可维护性和可扩展性。MVC模型将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。本文将深入探讨MVC模型的…