| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- let accessToken = "";
- let messageCallBack = null;
- let closeCallBack = null;
- let connectCallBack = null;
- let isConnect = false; //连接标识 避免重复连接
- let rec = null;
- let lastConnectTime = new Date(); // 最后一次连接时间
- let socketTask = null;
- let connect = (wsurl, token) => {
- accessToken = token;
- if (isConnect) {
- return;
- }
- lastConnectTime = new Date();
- socketTask = uni.connectSocket({
- url: wsurl,
- success: (res) => {},
- fail: (e) => {
- console.log(e);
- console.log("WebSocket连接失败,10s后重连");
- setTimeout(() => {
- connect();
- }, 10000)
- }
- });
- socketTask.onOpen((res) => {
- console.log("WebSocket连接成功");
- isConnect = true;
- // 发送登录命令
- let loginInfo = {
- cmd: 0,
- data: {
- accessToken: accessToken
- }
- };
- socketTask.send({
- data: JSON.stringify(loginInfo)
- });
- })
- socketTask.onMessage((res) => {
- let sendInfo = JSON.parse(res.data)
- if (sendInfo.cmd == 0) {
- heartCheck.start()
- connectCallBack && connectCallBack();
- console.log('WebSocket登录成功')
- } else if (sendInfo.cmd == 1) {
- // 重新开启心跳定时
- heartCheck.reset();
- } else {
- // 其他消息转发出去
- console.log("接收到消息", sendInfo);
- messageCallBack && messageCallBack(sendInfo.cmd, sendInfo.data)
- }
- })
- socketTask.onClose((res) => {
- console.log('WebSocket连接关闭')
- isConnect = false;
- closeCallBack && closeCallBack(res);
- })
- socketTask.onError(e => {
- console.log("ws错误:", e)
- close(1006);
- isConnect = false;
- closeCallBack && closeCallBack(e);
- })
- }
- //定义重连函数
- let reconnect = (wsurl, accessToken) => {
- console.log("尝试重新连接");
- if (isConnect) {
- return;
- }
- // 延迟10秒重连 避免过多次过频繁请求重连
- let timeDiff = new Date().getTime() - lastConnectTime.getTime()
- let delay = timeDiff < 10000 ? 10000 - timeDiff : 0;
- rec && clearTimeout(rec);
- rec = setTimeout(function() {
- connect(wsurl, accessToken);
- }, delay);
- };
- //设置关闭连接
- let close = (code) => {
- if (!isConnect) {
- return;
- }
- socketTask.close({
- code: code,
- complete: (res) => {
- isConnect = false;
- console.log("关闭websocket连接");
- },
- fail: (e) => {
- console.log("关闭websocket连接失败", e);
- }
- });
- };
- // 心跳设置
- let heartCheck = {
- timeout: 20000, //每段时间发送一次心跳包 这里设置为20s
- timeoutObj: null, //延时发送消息对象(启动心跳新建这个对象,收到消息后重置对象)
- start: function() {
- if (isConnect) {
- console.log('发送WebSocket心跳')
- let heartBeat = {
- cmd: 1,
- data: {}
- };
- sendMessage(JSON.stringify(heartBeat))
- }
- },
- reset: function() {
- clearTimeout(this.timeoutObj);
- this.timeoutObj = setTimeout(() => heartCheck.start(), this.timeout);
- }
- };
- let sendMessage = (message) => {
- socketTask.send({ data: message })
- }
- let onConnect = (callback) => {
- connectCallBack = callback;
- }
- let onMessage = (callback) => {
- messageCallBack = callback;
- }
- let onClose = (callback) => {
- closeCallBack = callback;
- }
- // 将方法暴露出去
- export {
- connect,
- reconnect,
- close,
- sendMessage,
- onConnect,
- onMessage,
- onClose
- }
|