websocket封装(含断网重连、支持同时建立多条连接、手动销毁)
1、新建websocket.js
/**
* 发起websocket请求函数
* @param {object} wsObj - ws对象
* @param {string} type - 操作websocket:销毁close、创建create
* @param {number} timeout - 心跳间隔时长,默认5000ms
* @param sendHeartBeat - 以心跳,内容体区分string、object
* @param {function} msgCallback - 接收到ws数据,对数据进行处理的回调函数
* @param {function} reCallback - ws每次重连时,暴露对外的回调函数
*/
export function websocketCommand(wsObj,type,timeout=5000, sendHeartBeat, msgCallback, reCallback) {
let wsDestroy = type ==='close'; // 销毁标志
let lockReconnect = false; // 是否真正建立连接
let timeoutObj = null; // 心跳倒计时
let serverTimeoutObj = null; // 服务器心跳倒计时
let timeoutnum = null; // 断开 重连倒计时
// 若type传入close,则意图销毁websocket
if(type==='close'){
clearTimeout(timeoutObj);
clearTimeout(serverTimeoutObj);
onClose();
}
// 若type传入create,则意图新建websocket,需初始化ws并发送心跳
if(type==='create'){
initWebsocket();
websocketSend();
}
function initWebsocket(){
if (typeof (WebSocket) === 'undefined') {
console.log();('您的浏览器不支持WebSocket,无法获取数据');
return false;
}
wsObj.onmessage = function (e) { onMessage(e) };
wsObj.onopen = function () { onOpen() };
wsObj.onerror = function () { onError() };
wsObj.onclose = function () { onClose() } ;
}
function websocketSend () {
// 加延迟是为了尽量让ws连接状态变为OPEN
setTimeout(() => {
// 添加状态判断,当为OPEN时,发送消息
if (wsObj.readyState === wsObj.OPEN) { // wsObj.OPEN = 1
// console.log('类型',typeof sendHeartBeat);
if( typeof sendHeartBeat == 'string'){
// 若发送基本类型数据作为心跳,如字符串,直接将参数发送给服务端
wsObj.send(sendHeartBeat)
}else{
// 若发送复杂类型数据作为心跳,如对象,则以回调方式暴露出去(得以支持动态数据)
sendHeartBeat();
}
}
// if (wsObj.readyState === wsObj.CLOSED) { // wsObj.CLOSED = 3
// console.log('readyState=3')
// }
}, 500)
}
function onMessage(evt) {
var received_msg = evt && JSON.parse(evt.data);
msgCallback(received_msg);
// 收到服务器信息, 重置服务器心跳
start();
}
function onError() {
console.log('ws_error');