Vue项目全局创建WebSocket连接(支持断线重连和心跳检测)

1.首先创建WebSocket.js,路径为/src/js/websocket.js,

2.在App.vue文件中引入我们创建的WebSockt.js,在created方法中调用Init方法初始化WebSocket连接

<template>
  <div id="app">
    <router-view />
  </div>
</template>

<script>
import websocket from '@/js/websocket'
export default {
  name: 'App',
  created(){
	  localStorage.setItem("clientId","user-1")
	  websocket.Init("user-1")
  }
}
</script>

由于所有页面都是在App.vue下面切换的,相当于App.vue是所有路由的父组件, 所以只需在App.vue中创建WebSocket即可实现全局创建

这样就全局创建成功了,让我们随便进入一个页面查看效果

image.png

image.png
WebSocket.js:

import store from '@/store'
import { Message } from 'element-ui'

var url = 'ws://127.0.0.1:9090/websocket/'
var ws;
var tt;
var lockReconnect = false;//避免重复连接
var clientId = localStorage.getItem("clientId")//缓存中取出客户端id

var websocket = {
  Init: function(clientId) {
    if ("WebSocket" in window) {
      ws = new WebSocket(url + clientId);
    } else if ("MozWebSocket" in window) {
      ws = new MozWebSocket(url + clientId);
    } else {
      console.log("您的浏览器不支持 WebSocket!");
      return;
    }

    ws.onmessage = function(e) {
      console.log("接收消息:" + e.data)
      heartCheck.start()
      if(e.data=='ok'){//心跳消息不做处理
        return
      }
      //messageHandle(e.data)
    }

    ws.onclose = function() {
      console.log("连接已关闭")
      Message({
      		message: '连接已关闭',
      		type: 'error',
      });
      reconnect(clientId);
    }

    ws.onopen = function() {
      console.log("连接成功")
      Message({
      		message: '连接成功',
      		type: 'success',
      });
      heartCheck.start();
    }

    ws.onerror = function(e) {
      console.log("数据传输发生错误");
      Message({
      		message: '数据传输发生错误',
      		type: 'error',
      });
      reconnect(clientId)
    }
  },
  Send:function(sender,reception,body,flag){
    let data = {
      sender:sender,
      reception:reception,
      body:body,
      flag:flag
    }
    let msg= JSON.stringify(data)
    console.log("发送消息:"+msg)
    ws.send(msg)
  },
  getWebSocket(){
    return ws;
  },
  getStatus() {
    if (ws.readyState == 0) {
      return "未连接";
    } else if (ws.readyState == 1) {
      return "已连接";
    } else if (ws.readyState == 2) {
      return "连接正在关闭";
    } else if (ws.readyState == 3) {
      return "连接已关闭";
    }
  }
}

export default websocket;

//根据消息标识做不同的处理
function messageHandle(message) {
  let msg = JSON.parse(message)
  switch (msg.flag) {
    case 'command':
      console.log("指令消息类型")
      break;
    case 'inform':
      console.log("通知")
      break;
    default:
      console.log("未知消息类型")
  }
}

function reconnect(sname) {
  if(lockReconnect) {
    return;
  };
  lockReconnect = true;
  //没连接上会一直重连,设置延迟避免请求过多
  tt && clearTimeout(tt);
  tt = setTimeout(function () {
    console.log("执行断线重连...")
    websocket.Init(sname);
    lockReconnect = false;
  }, 4000);
}

//心跳检测
var heartCheck = {
  timeout: 1000 * 60 * 3,
  timeoutObj: null,
  serverTimeoutObj: null,
  start: function(){
    console.log('开始心跳检测');
    var self = this;
    this.timeoutObj && clearTimeout(this.timeoutObj);
    this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
    this.timeoutObj = setTimeout(function(){
      //这里发送一个心跳,后端收到后,返回一个心跳消息,
      //onmessage拿到返回的心跳就说明连接正常
      console.log('心跳检测...');
      ws.send("HeartBeat:"+ clientId );
      self.serverTimeoutObj = setTimeout(function() {
        if(ws.readyState!=1){
           ws.close();
        }
        // createWebSocket();
      }, self.timeout);

    }, this.timeout)
  }
}

  • 9
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Vue项目中使用Node.js创建WebSocket服务器,首先需要安装WebSocket库。可以通过npm命令安装ws库,如下: ``` npm install ws ``` 接下来,在Node.js文件中引入ws库,并创建WebSocket服务器实例。代码示例如下: ```javascript // 引入ws库 const WebSocket = require('ws'); // 创建WebSocket服务器实例 const server = new WebSocket.Server({ port: 8080 }); // 监听连接事件 server.on('connection', (socket) => { console.log('有新的WebSocket连接'); // 监听接收消息事件 socket.on('message', (message) => { console.log('收到消息:', message); // 向客户端发送消息 socket.send('服务器发送的消息'); }); // 监听连接事件 socket.on('close', () => { console.log('WebSocket连接开'); }); }); console.log('WebSocket服务器已启动'); ``` 上述代码创建了一个WebSocket服务器实例,并监听连接、接收消息以及连接等事件。当有新的WebSocket连接时,控制台会打印"有新的WebSocket连接"。当接收到客户端发送的消息时,控制台会打印"收到消息:"并输出消息内容,同时向客户端发送"服务器发送的消息"。当WebSocket连接开时,控制台会打印"WebSocket连接开"。 启动服务器后,可以在Vue项目中使用WebSocket客户端连接到该服务器,并进行消息的发送和接收。在Vue组件中使用WebSocket客户端的代码示例如下: ```javascript // 创建WebSocket客户端实例 const socket = new WebSocket('ws://localhost:8080'); // 监听连接打开事件 socket.onopen = () => { console.log('WebSocket连接已打开'); // 向服务器发送消息 socket.send('客户端发送的消息'); }; // 监听接收消息事件 socket.onmessage = (event) => { console.log('收到消息:', event.data); // 关闭WebSocket连接 socket.close(); }; // 监听连接关闭事件 socket.onclose = () => { console.log('WebSocket连接已关闭'); }; ``` 上述代码创建了一个WebSocket客户端实例,连接到服务器的地址为'ws://localhost:8080'。当WebSocket连接打开时,控制台会打印"WebSocket连接已打开"并向服务器发送"客户端发送的消息"。当接收到服务器发送的消息时,控制台会打印"收到消息:"并输出消息内容。当WebSocket连接关闭时,控制台会打印"WebSocket连接已关闭"。 通过以上步骤,就可以在Vue项目中使用Node.js创建WebSocket服务器,并实现与客户端的消息传递。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值