vue使用websocket(前端心跳、主动关闭连接,同一账号一起登陆)

代码部分

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,然后轮询就可以了
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容