uniapp socket 封装 (可拿去直接用)
示例代码:
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;
使用方式:
//地址和后端约定好就行
const socket = new WebSocketClient('wss://example.net/websocket')
socket.connect() //连接
socket.send({//这里写后端需要的东西
})
//这里不一定是 message,和后端约定好
socket.on('message',(res)=>{})socket.startHeartbeat() //开始心跳
socket.stopHeartbeat() //结束心跳
socket.close() //关闭socket