|
|
// 在Vue中使用,不需要可以去除以下引用
|
|
|
import Vue, {ComponentOptions as h} from 'vue'
|
|
|
import axios from "axios";
|
|
|
// import storage from 'store'
|
|
|
import storage from "./store/index";
|
|
|
import "./element";
|
|
|
// 导出socket对象
|
|
|
|
|
|
export {
|
|
|
socket
|
|
|
}
|
|
|
|
|
|
// socket主要对象
|
|
|
var socket = {
|
|
|
websock: null,
|
|
|
// 固定的WebSocket地址:此处是从env文件中读取socket地址,可以自行从其他config文件中读取或直接写死
|
|
|
// 如需使用动态WebSocket地址,请自行作ajax通讯后扩展
|
|
|
// ws_url: "ws://127.0.0.1:9991/api/websocket/100",
|
|
|
// 开启标识
|
|
|
socket_open: false,
|
|
|
// 心跳timer
|
|
|
hearbeat_timer: null,
|
|
|
// 心跳发送频率
|
|
|
hearbeat_interval: 5000,
|
|
|
ws_url:null,
|
|
|
// 是否自动重连
|
|
|
is_reonnect: true,
|
|
|
// 重连次数
|
|
|
reconnect_count: 3,
|
|
|
// 已发起重连次数
|
|
|
reconnect_current: 1,
|
|
|
// 重连timer
|
|
|
reconnect_timer: null,
|
|
|
// 重连频率
|
|
|
reconnect_interval: 3000,
|
|
|
myVue:{},
|
|
|
|
|
|
/**
|
|
|
* 初始化连接
|
|
|
*/
|
|
|
init: (data) => {
|
|
|
axios.get("./config.json").then(res => {
|
|
|
// 基础地址
|
|
|
socket.ws_url = res.data.WEBSOCKET_URL;
|
|
|
console.log(res.data.BASE_URL + "\n" + res.data.WEBSOCKET_URL);
|
|
|
socket.initData(data);
|
|
|
});
|
|
|
},
|
|
|
|
|
|
initData: (data) => {
|
|
|
|
|
|
console.log(data);
|
|
|
socket.myVue = data;
|
|
|
if (!("WebSocket" in window)) {
|
|
|
console.log('浏览器不支持WebSocket')
|
|
|
return null
|
|
|
}
|
|
|
|
|
|
// 已经创建过连接不再重复创建
|
|
|
if (socket.websock) {
|
|
|
return socket.websock
|
|
|
}
|
|
|
|
|
|
socket.websock = new WebSocket(socket.ws_url+"/100")
|
|
|
socket.websock.onmessage = function (e) {
|
|
|
socket.receive(e)
|
|
|
}
|
|
|
|
|
|
// 关闭连接
|
|
|
socket.websock.onclose = function (e) {
|
|
|
console.log('连接已断开')
|
|
|
console.log('connection closed (' + e.code + ')')
|
|
|
clearInterval(socket.hearbeat_interval)
|
|
|
socket.socket_open = false
|
|
|
|
|
|
// 需要重新连接
|
|
|
if (socket.is_reonnect) {
|
|
|
socket.reconnect_timer = setTimeout(() => {
|
|
|
// 超过重连次数
|
|
|
if (socket.reconnect_current > socket.reconnect_count) {
|
|
|
clearTimeout(socket.reconnect_timer)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
// 记录重连次数
|
|
|
socket.reconnect_current++
|
|
|
socket.reconnect()
|
|
|
}, socket.reconnect_interval)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 连接成功
|
|
|
socket.websock.onopen = function () {
|
|
|
console.log('连接成功')
|
|
|
socket.socket_open = true
|
|
|
socket.is_reonnect = true
|
|
|
// 开启心跳
|
|
|
socket.heartbeat()
|
|
|
}
|
|
|
|
|
|
// 连接发生错误
|
|
|
socket.websock.onerror = function () {
|
|
|
console.log('WebSocket连接发生错误')
|
|
|
}
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 发送消息
|
|
|
* @param {*} data 发送数据
|
|
|
* @param {*} callback 发送后的自定义回调函数
|
|
|
*/
|
|
|
send: (data, callback = null) => {
|
|
|
// 开启状态直接发送
|
|
|
if (socket.websock.readyState === socket.websock.OPEN) {
|
|
|
socket.websock.send(JSON.stringify(data))
|
|
|
|
|
|
if (callback) {
|
|
|
callback()
|
|
|
}
|
|
|
|
|
|
// 正在开启状态,则等待1s后重新调用
|
|
|
} else if (socket.websock.readyState === socket.websock.CONNECTING) {
|
|
|
setTimeout(function () {
|
|
|
socket.send(data, callback)
|
|
|
}, 1000)
|
|
|
|
|
|
// 未开启,则等待1s后重新调用
|
|
|
} else {
|
|
|
socket.init()
|
|
|
setTimeout(function () {
|
|
|
socket.send(data, callback)
|
|
|
}, 1000)
|
|
|
}
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 接收消息
|
|
|
* @param {*} message 接收到的消息
|
|
|
*/
|
|
|
receive: (message) => {
|
|
|
var params = JSON.parse(message.data)
|
|
|
|
|
|
if (params.type != 0) {
|
|
|
console.log('收到服务器内容:', message.data)
|
|
|
}
|
|
|
|
|
|
if (params == undefined) {
|
|
|
console.log("收到服务器空内容")
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
// 以下是接收消息后的业务处理,仅供参考
|
|
|
|
|
|
// 被服务器强制断开
|
|
|
if (params.type != undefined && params.type == 110) {
|
|
|
socket.socket_open = false
|
|
|
socket.is_reonnect = true
|
|
|
|
|
|
// 被服务器踢掉
|
|
|
} else if (params.type == 99) {
|
|
|
socket.socket_open = true
|
|
|
socket.is_reonnect = false
|
|
|
console.log("被挤下线 不做处理")
|
|
|
return false
|
|
|
} else if (params.type == 'sid') {
|
|
|
socket.myVue.$notify.success({
|
|
|
title: '提示',
|
|
|
message: params.data
|
|
|
});
|
|
|
}else if(params.type == 'err'){
|
|
|
socket.myVue.$notify.error({
|
|
|
title: '提示',
|
|
|
message: params.data
|
|
|
});
|
|
|
}
|
|
|
|
|
|
// 自行扩展其他业务处理...
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 心跳
|
|
|
*/
|
|
|
heartbeat: () => {
|
|
|
console.log('socket', 'ping')
|
|
|
if (socket.hearbeat_timer) {
|
|
|
clearInterval(socket.hearbeat_timer)
|
|
|
}
|
|
|
|
|
|
socket.hearbeat_timer = setInterval(() => {
|
|
|
const token = storage.get('Access-Token')
|
|
|
var data = {
|
|
|
type: 0, //请求类型 type 0 心跳包
|
|
|
shop_id: Vue.prototype.$shop_id(false), //如果是商家 传当前店铺ID 否则可不传
|
|
|
'API-Token': token, //用户的token
|
|
|
'API-Source': 'MERCHANT', // MERCHANT 商家 CUSTOMER 顾客
|
|
|
}
|
|
|
socket.send(data)
|
|
|
}, socket.hearbeat_interval)
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 主动关闭连接
|
|
|
*/
|
|
|
close: () => {
|
|
|
console.log('主动断开连接')
|
|
|
clearInterval(socket.hearbeat_interval)
|
|
|
socket.is_reonnect = false
|
|
|
socket.websock.close()
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 重新连接
|
|
|
*/
|
|
|
reconnect: () => {
|
|
|
console.log('发起重新连接', socket.reconnect_current)
|
|
|
|
|
|
if (socket.websock && socket.socket_open) {
|
|
|
socket.websock.close()
|
|
|
}
|
|
|
|
|
|
socket.init()
|
|
|
},
|
|
|
}
|