vue使用面向对象的方式创建websocket 使用

1.新建websocket.js文件夹,复制下面代码在创建js文件里。

import CryptoJS from "crypto-js"; //加密js,看项目需求是否引入
// 加密
function encrypt(word, keyStr) {
  keyStr = "ev##hna4FNN!y6a4";
  let key = CryptoJS.enc.Utf8.parse(keyStr);
  let srcs = CryptoJS.enc.Utf8.parse(word);
  let encrypted = CryptoJS.AES.encrypt(srcs, key, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7,
  });
  return encrypted.toString();
}

class Person {
  socket = null; //socket 初始化创建的socket对象
  Times = null;    //Times 定时器对象,用于关闭心跳倒计时
  heartbeatTime = 1; //heartbeatTime 心跳倒计时秒
  constructor() {}
  //初始化
  scoketInit() {
    if (typeof WebSocket == "undefined") {
      console.log("您的浏览器不支持WebSocket");
    } else {
      var socketUrl;
      switch (process.env.NODE_ENV) {
        case "development":
          socketUrl = "" //本地运行ws地址
          break;
        case "production":
          socketUrl = "" //发布线上ws地址
          break;
      }
      if (this.socket != null) {
        this.socket.close();
        this.socket = null;
      }
      this.socket = new WebSocket(socketUrl);
      this.socket.onclose = function () {}
      this.socket.onerror = function () {
        // console.log("websocket错误。。。。");
      };
    }
  }
  // 清除scoket
  scoketEmpty() {
    this.socket = null;
    this.Times = null;
    this.heartbeatTime = 1;
  }
  socketOnopen() {
    //打开链接事件
    let that = this
    return new Promise((resolve, reject) => {
      that.socket.onopen = function () {
        // console.log("websocket已打开");
        resolve(that.socket)
      };
    })
  }
  //发送消息
  sendMsg(data) {
    this.socket.send(JSON.stringify({
      "params": data
    }))
  }
  //接收消息
  receiveMsg(data) {
    return this.socket
  }
  //发生错误
  socketError(callback) {
    let that = this
    this.socket.onerror = function () {
      console.log("socket 发生错误!");
      callback()
    };
  }
  //scoket 关闭
  socketClose(callback) {
    //  callback 回调函数 当scoket发生关闭时通知调取页面
    let that = this
    this.socket.onclose = function () {
      callback()
    };
  }
  //   开启心跳
  StartHeartbeat() {
    let that = this
    that.Times = setInterval(() => {
      if (that.heartbeatTime <= 0) {
        console.log("心跳时间倒计时 发送");
        that.heartbeatTime = 26;
           //encrypt 字段加密  通过定时器给服务器发送心跳
        let data = encrypt(JSON.stringify({
          cmdName: "heart",
          param: {}
        }));
        that.sendMsg(data)
      } else {
        that.heartbeatTime = that.heartbeatTime - 1;
      }
    }, 1000);
  }
  //关闭心跳 //# scoket
  closeHeartbeat() {
    console.log("关闭心跳定时器");
    this.socket.onclose()
    this.socket = null;
    this.heartbeatTime = 1;
    clearInterval(this.Times);
  }
}

export default Person;

2.vue页面使用


import Person from "@/assets/js/scoketClass";
const socket = new Person();
//引入同时new

export default {
  mounted() {
    socket.scoketEmpty(); //数据初始化
    socket.scoketInit(); //socket初始化
    this.scoketAdd(); //
  },
  methods(){
    //手动链接
    socketReconnection() {
      socket.scoketEmpty();
      socket.scoketInit();
      this.scoketAdd();
    },
    socketAdd() {
      console.log("websocket 函数执行");
      let that = this;
        //异步执行
      socket.socketOnopen().then((resd) => {
        console.log("websocket已连接");
        that.isScoketLink = true;
        let data = encrypt(
          JSON.stringify({ cmdName: "systemManagement", param: {} })
        );
        socket.sendMsg(data);
        //我的后端需求链接后首次发送信息后,才能获取消息

        // start 开始心跳倒计时,
        socket.StartHeartbeat();

        //scoket 链接关闭
        socket.socketClose(function () {
            //网络波动或者其他原因导致的socket断开链接,回调方法可通知到当前页面
          that.$notify.error({
            title: "提示",
            message: "聊天监控已断开链接!",
          });
          console.log("socket 断开链接!");
        });

        //scoket 发生错误
        socket.socketError(function () {
            //连接发生错误时候,回调可通知到当前页面
          console.log("socket 发生错误!");
        });

        //接收消息
        socket.receiveMsg().onmessage = (resMsg) => {
          console.log("socket 接收消息!",resMsg);
        };
      });
    },

  beforeDestroy() {
    // 离开页面关闭socket连接
    socket.closeHeartbeat();
  },
  }

}

到这里就结束了,谢谢观看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
首先,你需要在Vue项目安装`socket.io-client`依赖包,可以使用以下命令进行安装: ``` npm install socket.io-client --save ``` 接着,在Vue组件引入`socket.io-client`依赖包,并创建一个WebSocket连接,如下所示: ```javascript import io from 'socket.io-client'; export default { data() { return { socket: null, }; }, mounted() { // 创建socket连接 this.socket = io('http://localhost:3000'); // 监听连接成功事件 this.socket.on('connect', () => { console.log('连接成功'); }); // 监听服务器发送的消息 this.socket.on('receiveMessage', (message) => { console.log(message); }); }, methods: { // 发送消息 sendMessage() { this.socket.emit('sendMessage', 'Hello, World!'); }, }, }; ``` 以上代码,我们首先引入了`socket.io-client`依赖包,并在`mounted`生命周期函数创建了一个WebSocket连接,连接到了本地的3000端口,同时也监听了连接成功事件。接着,我们监听了服务器发送的消息,并在控制台输出了消息。最后,我们在`sendMessage`方法向服务器发送了一条消息。 在服务端,你需要使用`socket.io`依赖包来创建WebSocket服务,可以使用以下命令进行安装: ``` npm install socket.io --save ``` 接着,创建一个`app.js`文件,并编写WebSocket服务的代码,如下所示: ```javascript const app = require('express')(); const server = require('http').createServer(app); const io = require('socket.io')(server); // 监听连接事件 io.on('connection', (socket) => { console.log('客户端已连接'); // 监听客户端发送的消息 socket.on('sendMessage', (message) => { console.log(message); // 向客户端发送消息 io.emit('receiveMessage', message); }); // 监听断开连接事件 socket.on('disconnect', () => { console.log('客户端已断开连接'); }); }); // 启动WebSocket服务 server.listen(3000, () => { console.log('WebSocket服务已启动'); }); ``` 以上代码,我们首先引入了`express`和`socket.io`依赖包,并创建了一个`server`对象。接着,我们使用`io.on('connection', callback)`方法监听了客户端连接事件,并在回调函数输出了客户端已连接的信息。同时,我们也监听了客户端发送的消息,并向所有客户端发送了接收到的消息。最后,我们监听了客户端断开连接事件,并在回调函数输出了客户端已断开连接的信息。 最后,在命令行窗口运行以下命令启动WebSocket服务: ``` node app.js ``` 至此,你已经成功创建了一个WebSocket服务,并在Vue项目使用WebSocket与服务端进行通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值