代码部分
import Cookies from "js-cookie";
export default class {
/**
*
* @param option:{
*url:地址
*webSocketType:区分不同的websocket,主要用于多个websocket的关闭,前端不
需要主动关闭可以不用
*onMessageCallBack:前端接收到后端发送消息的回调方法
*}
*/
constructor(option) {
this.url = option.url
this.webSocketType = option.webSocketType
this.option = option
this.websocket = null
this.init()
}
/**
* 判断环境
*/
init(){
var _this = this;
if ( typeof WebSocket === 'undefined') {
this.$message.error('您的浏览器不支持socket')
}else{
this.websocket = new WebSocket(this.url);
this.websocket.onopen = function(evt) { _this.onOpen(evt) };
this.websocket.onmessage = function(evt) { _this.onMessage(evt) };
this.websocket.onclose = function(evt) {
debugger
_this.onClose(evt) };
this.websocket.onerror = function(evt) { _this.onError(evt) };
}
}
onOpen(evt)
{
let _this = this;
// 心跳检验
var heartCheck = {
timeout: 5000,//5秒
timeoutObj: null,
reset: function () {
clearInterval(this.timeoutObj);
return this;
},
start: function () {
let thisHeartCheck = this;
this.timeoutObj = setInterval(function () {
if(_this.websocket.readyState != 1 ||
(_this.webSocketType && _this.webSocketType == 'XXX' &&
Cookies.get('XXX') == "false")){
thisHeartCheck.reset()
_this.onClose()
}else{
_this.websocket.send("HeartBeat"); // 发送心跳信息,保持不断
}
}, this.timeout)
}
}
console.log("websock连接成功");
heartCheck.reset().start();
}
doSend(message)
{
this.websocket.send(message);
}
// 从后台接收参数
onMessage(evt)
{
if(this.option && this.option.onMessageCallBack instanceof Function){
this.option.onMessageCallBack(evt.data ? JSON.parse(evt.data) : '')
}
// this.websocket.close();
}
onError(evt)
{
console.log('websocket发生错误')
this.onClose()
}
// 最后关闭
onClose(evt)
{
this.websocket.close()
console.log('websocket关闭')
}
}
上面代码主要是 if(_this.websocket.readyState != 1 ||
(_this.webSocketType && _this.webSocketType == 'XXX' &&
Cookies.get('XXX') == "false"))这一段有点歧义,
意思是,后台主动断开连接或者前端主动断开链接这两种情况下,前端手动断开链接
调用方法
let websocket = new Websocket({url:'ws://127.0.0.1:8090/websocket/sign',webSocketType:'XX',onMessageCallBack:'回调方法'})
同一账号一起登陆
遇到同一个账号需要一起登陆的情况下,需要在前端传一个uuid作为sign给后端,
后端使用这个uuid来作为websocket的线程id,然后再推送消息给前端的时候只需要
websocketServer.getWebSocketMap()获取所有的websocket,然后轮询就可以了