You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
3.6 KiB
191 lines
3.6 KiB
class WebSocketClass {
|
|
constructor(url) {
|
|
this.lockReconnect = false; // 是否开始重连
|
|
this.wsUrl = ""; // ws 地址
|
|
this.globalCallback = null; // 回调方法
|
|
this.userClose = false; // 是否主动关闭
|
|
this.createWebSocket(url);
|
|
}
|
|
|
|
createWebSocket(url) {
|
|
// #ifdef H5
|
|
if (typeof(WebSocket) === 'undefined') {
|
|
this.writeToScreen("您的浏览器不支持WebSocket,无法获取数据");
|
|
return false
|
|
}
|
|
// #endif
|
|
|
|
// #ifdef APP-PLUS
|
|
if (typeof(uni.connectSocket) === 'undefined') {
|
|
this.writeToScreen("您的浏览器不支持WebSocket,无法获取数据");
|
|
return false
|
|
}
|
|
// #endif
|
|
|
|
this.wsUrl = url;
|
|
try {
|
|
// 创建一个this.ws对象【发送、接收、关闭socket都由这个对象操作】
|
|
|
|
// #ifdef H5
|
|
this.ws = new WebSocket(this.wsUrl);
|
|
this.initEventHandle();
|
|
// #endif
|
|
|
|
// #ifdef APP-PLUS
|
|
let that = this
|
|
this.ws = uni.connectSocket({
|
|
url: this.wsUrl,
|
|
success(data) {
|
|
console.log("websocket连接成功");
|
|
|
|
that.initEventHandle();
|
|
},
|
|
});
|
|
// #endif
|
|
} catch (e) {
|
|
this.reconnect(url);
|
|
}
|
|
}
|
|
|
|
// 初始化
|
|
initEventHandle() {
|
|
/**
|
|
* 监听WebSocket连接打开成功
|
|
*/
|
|
|
|
// #ifdef H5
|
|
this.ws.onopen = (event) => {
|
|
console.log("WebSocket连接打开");
|
|
};
|
|
// #endif
|
|
|
|
// #ifdef APP-PLUS
|
|
this.ws.onOpen(res => {
|
|
console.log('WebSocket连接打开');
|
|
});
|
|
// #endif
|
|
|
|
|
|
/**
|
|
* 连接关闭后的回调函数
|
|
*/
|
|
|
|
// #ifdef H5
|
|
this.ws.onclose = (event) => {
|
|
if (!this.userClose) {
|
|
this.reconnect(this.wsUrl); //重连
|
|
}
|
|
};
|
|
// #endif
|
|
|
|
// #ifdef APP-PLUS
|
|
this.ws.onClose(() => {
|
|
if (!this.userClose) {
|
|
this.reconnect(this.wsUrl); //重连
|
|
}
|
|
});
|
|
// #endif
|
|
|
|
|
|
/**
|
|
* 报错时的回调函数
|
|
*/
|
|
|
|
// #ifdef H5
|
|
this.ws.onerror = (event) => {
|
|
if (!this.userClose) {
|
|
this.reconnect(this.wsUrl); //重连
|
|
}
|
|
};
|
|
// #endif
|
|
|
|
// #ifdef APP-PLUS
|
|
this.ws.onError(() => {
|
|
if (!this.userClose) {
|
|
this.reconnect(this.wsUrl); //重连
|
|
}
|
|
});
|
|
// #endif
|
|
|
|
|
|
/**
|
|
* 收到服务器数据后的回调函数
|
|
*/
|
|
|
|
// #ifdef H5
|
|
this.ws.onmessage = (event) => {
|
|
|
|
this.globalCallback(JSON.parse(event.data))
|
|
};
|
|
// #endif
|
|
|
|
// #ifdef APP-PLUS
|
|
this.ws.onMessage(event => {
|
|
this.globalCallback(JSON.parse(event.data))
|
|
});
|
|
// #endif
|
|
}
|
|
|
|
// 关闭ws连接回调
|
|
reconnect(url) {
|
|
if (this.lockReconnect) return;
|
|
this.ws.close();
|
|
this.lockReconnect = true; // 关闭重连,没连接上会一直重连,设置延迟避免请求过多
|
|
setTimeout(() => {
|
|
this.createWebSocket(url);
|
|
this.lockReconnect = false;
|
|
}, 1000);
|
|
}
|
|
|
|
// 发送信息方法
|
|
webSocketSendMsg(msg) {
|
|
// #ifdef H5
|
|
this.ws && this.ws.send(JSON.stringify(msg));
|
|
// #endif
|
|
|
|
// #ifdef APP-PLUS
|
|
this.ws && this.ws.send({
|
|
data: JSON.stringify(msg),
|
|
success() {
|
|
console.log("消息发送成功");
|
|
},
|
|
fail(err) {
|
|
console.log("关闭失败", err)
|
|
}
|
|
});
|
|
// #endif
|
|
|
|
}
|
|
|
|
// 获取ws返回的数据方法
|
|
getWebSocketMsg(callback) {
|
|
this.globalCallback = callback
|
|
}
|
|
|
|
// 关闭ws方法
|
|
closeSocket() {
|
|
if (this.ws) {
|
|
this.userClose = true;
|
|
// #ifdef H5
|
|
this.ws && this.ws.close();
|
|
// #endif
|
|
|
|
// #ifdef APP-PLUS
|
|
this.ws.close({
|
|
success(res) {
|
|
console.log("关闭成功", res)
|
|
},
|
|
fail(err) {
|
|
console.log("关闭失败", err)
|
|
}
|
|
});
|
|
// #endif
|
|
|
|
}
|
|
}
|
|
|
|
writeToScreen(massage) {
|
|
console.log(massage);
|
|
}
|
|
}
|
|
export default WebSocketClass;
|
|
|