uniapp socket 封装 (可拿去直接用)

示例代码:

javascript 复制代码
class WebSocketClient {
	constructor(url, options = {}) {
		this.url = url;
		this.options = options;
		this.socket = null;
		this.reconnectAttempts = 0;
		this.maxReconnectAttempts = options.maxReconnectAttempts || 5;
		this.reconnectInterval = options.reconnectInterval || 5000;
		this.heartbeatInterval = options.heartbeatInterval || 30000;
		this.heartbeatTimer = null;
		this.messageQueue = [];
		this.eventListeners = {};
		this.isConnected = false;
	}

	connect() {
		this.socket = uni.connectSocket({
			url: this.url,
			success: () => {
				uni.onSocketOpen((res) => {
					this.isConnected = true;
					this.reconnectAttempts = 0;
					this.startHeartbeat();
					this.flushMessageQueue();
					this.emit('open');
				})

				uni.onSocketMessage((res) => {
					this.emit('message', res.data);
				})

				uni.onSocketClose((res)=>{
					this.isConnected = false;
					this.stopHeartbeat();
					this.emit('close');
					this.handleReconnect();
				})
				uni.onSocketError((error)=>{
					this.emit('error', error);
				})
			}
		});
		console.log(this.socket);
	}

	send(message) {
		if (this.isConnected) {
			uni.sendSocketMessage({
				data: JSON.stringify(message)
			})
		} else {
			this.messageQueue.push(message);
		}
	}

	flushMessageQueue() {
		while (this.messageQueue.length > 0 && this.isConnected) {
			const message = this.messageQueue.shift();
			uni.sendSocketMessage({
				data: JSON.stringify(message)
			})
		}
	}

	startHeartbeat() {
		this.stopHeartbeat();
		this.heartbeatTimer = setInterval(() => {
			if (this.isConnected) {
				this.send({
					type: 'heartbeat'
				});
			}
		}, this.heartbeatInterval);
	}

	stopHeartbeat() {
		if (this.heartbeatTimer) {
			clearInterval(this.heartbeatTimer);
			this.heartbeatTimer = null;
		}
	}

	handleReconnect() {
		if (this.reconnectAttempts < this.maxReconnectAttempts) {
			this.reconnectAttempts++;
			setTimeout(() => {
				this.connect();
			}, this.reconnectInterval);
		}
	}

	on(event, callback) {
		if (!this.eventListeners[event]) {
			this.eventListeners[event] = [];
		}
		this.eventListeners[event].push(callback);
	}

	off(event, callback) {
		if (this.eventListeners[event]) {
			this.eventListeners[event] = this.eventListeners[event].filter(
				(cb) => cb !== callback
			);
		}
	}

	emit(event, ...args) {
		if (this.eventListeners[event]) {
			this.eventListeners[event].forEach((callback) => {
				callback(...args);
			});
		}
	}

	close() {
		this.stopHeartbeat();
		this.socket.close({});
	}
}

export default WebSocketClient;

使用方式:

javascript 复制代码
//地址和后端约定好就行
const socket = new WebSocketClient('wss://example.net/websocket')
socket.connect() //连接
socket.send({
	//这里写后端需要的东西
})
//这里不一定是 message,和后端约定好
socket.on('message',(res)=>{
    
})

socket.startHeartbeat() //开始心跳
socket.stopHeartbeat() //结束心跳
socket.close() //关闭socket
相关推荐
子兮曰8 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰8 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万8 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝8 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋9 小时前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁9 小时前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
只睡四小时10 小时前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
李少兄10 小时前
JavaScript 隐式全局变量解析
javascript
汉堡大王952711 小时前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大11 小时前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端