示例代码:
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