首页 > 其他分享 >websocket连接

websocket连接

时间:2024-08-15 18:17:40浏览次数:5  
标签:info false socket websocket message 连接

https://blog.csdn.net/qq_70071513/article/details/133171580

//暴露自定义websocket对象
export const socket = {
  //后台请求路径
  url: "",
  //websocket对象
  websocket: null,
  //websocket状态
  websocketState: false,
  //重新连接次数
  reconnectNum: 0,
  //重连锁状态,保证重连按顺序执行
  lockReconnect: false,
  //定时器信息
  timeout: null,
  clientTimeout: null,
  serverTimeout: null,
  //初始化方法,根据url创建websocket对象封装基本连接方法,并重置心跳检测
  initWebSocket(newUrl) {
    socket.url = newUrl;
    socket.websocket = new WebSocket(socket.url);
    socket.websocket.onopen = socket.websocketOnOpen;
    socket.websocket.onerror = socket.websocketOnError;
    socket.websocket.onclose = socket.websocketOnClose;
    this.resetHeartbeat()
  },
  reconnect() {
    //判断连接状态
    if (socket.lockReconnect) return;
    socket.reconnectNum += 1;
    //重新连接三次还未成功调用连接关闭方法
    if (socket.reconnectNum === 3) {
      socket.reconnectNum = 0;
      socket.websocket.onclose()
      return;
    }
    //等待本次重连完成后再进行下一次
    socket.lockReconnect = true;
    //5s后进行重新连接
    socket.timeout = setTimeout(() => {
      socket.initWebSocket(socket.url);
      socket.lockReconnect = false;
    }, 5000);
  },
  //重置心跳检测
  resetHeartbeat() {
    socket.heartbeat();
  },
  //心跳检测
  heartbeat() {
    socket.clientTimeout = setTimeout(() => {
      if (socket.websocket) {
        //向后台发送消息进行心跳检测
        socket.websocket.send(JSON.stringify({ type: "heartbeat" }));
        socket.websocketState = false;
        //一分钟内服务器不响应则关闭连接
        socket.serverTimeout = setTimeout(() => {
          if (!socket.websocketState) {
            socket.websocket.onclose()
          } else {
            this.resetHeartbeat()
          }
        }, 60 * 1000);
      }
    }, 3 * 1000);
  },
  //发送消息
  sendMsg(message) {
    socket.websocket.send(JSON.stringify({ type: "message", message: message}));
  },
  websocketOnOpen(event) {
    //连接开启后向后台发送消息进行一次心跳检测
    socket.websocket.send(JSON.stringify({ type: "heartbeat" }));
  },
  websocketOnError(error) {
    console.log(error);
    socket.reconnect();
  },
  websocketOnClose() {
    socket.websocket.close();
  },
};

 

 

2.引入websocket.js

//引入socket对象
import { socket } from "@/utils/websocket";

 

3.使用

created() {
    this.getMessageNumber()
    //初始化websocket对象
    socket.initWebSocket(process.env.VUE_APP_BASE_WS + "/" + window.localStorage.getItem("webSocketKey"));
    //绑定接收消息方法
    socket.websocket.onmessage = this.websocketOnMessage;
  },
  beforeDestroy() {
    // 组件销毁时关闭链接释放资源
    socket.websocketOnClose()
  },
  methods: {
    /** 初始化连接测试*/
    init() {
      socket.websocketOnOpen();
    },

    /** 接收websocket消息*/
    websocketOnMessage(event) {
      //初始化界面时,会主动向后台发送一次消息,获取数据
      this.websocketCount += 1;

      //没有发送成功则重新初始化一次
      if (this.websocketCount === 0) {
        this.init();
      }
      let info = JSON.parse(event.data);
      switch (info.type) {
        case "heartbeat":
          socket.websocketState = true;
          break;
        case "message":
          this.loading = true;
          this.$nextTick(() => {
            // 收到文本消息
            this.consumeTextMessage(info)
            
            //收到文件消息
            //this.consumeFileMessage(info);
          })
          break;
        case "error":
          this.loading = false;
          break;
      }
    },

    /** 处理推送的文本数据 */
    consumeTextMessage(info) {
      const h = this.$createElement;
      this.$notify({
        title: '新的通知',
        message: h('i', { style: 'color: teal'}, info.message)
      });
    },

    /** 处理推送的文件数据 这里发送的是xlsx文件,可根据需求自定义,也可以将文件名一起从后端传过来 */
    consumeFileMessage(info) {
      let infoObj = info
      //服务器向客户端推送文件  生成文件
      Base64StrToFileUtil.downloadFileByBase64(infoObj.message, "01.xlsx")
    }
  }

  

 

标签:info,false,socket,websocket,message,连接
From: https://www.cnblogs.com/wangshengli520/p/18361537

相关文章

  • Spring Boot应用的数据库连接池管理
    SpringBoot应用的数据库连接池管理大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!数据库连接池是SpringBoot应用与数据库交互的重要组成部分,它帮助应用管理数据库连接,提高资源利用率和系统性能。SpringBoot内置了对多种数据库连接池的支持,包括Hik......
  • 读取配置连接信息,利用mybatis进行数据库连接操作
    mybatisConnConfig.properties配置文件内容default.configpath=config/mybatis/mybatis-config.xmldw.jdbc.system.driver=com.mysql.jdbc.Driverdw.jdbc.system.url=dw.jdbc.system.username=dw.jdbc.system.password=ralid.jdbc.system.driver=com.mysql.jdbc.Driver......
  • Qt5编译qmqtt库使用MQTT协议连接华为云IOT完成数据上传与交互
    一、前言随着物联网技术的发展,越来越多的设备通过网络互相连接,形成了庞大的智能系统。这些系统能够收集、分析并响应各种数据,从而实现自动化控制和智能化管理。在这个背景下,MQTT成为了一个广泛使用的轻量级消息传输协议,特别适用于资源受限的环境,如移动应用或远程传感器网......
  • PHP转Go系列 | ThinkPHP与Gin框架之打造基于WebSocket技术的消息推送中心
    大家好,我是码农先森。在早些年前客户端想要实时获取到最新消息,都是使用定时长轮询的方式,不断的从服务器上获取数据,这种粗暴的骚操作实属不雅。不过现如今我也还见有人还在一些场景下使用,比如在PC端扫描二维码,然后使用长轮询的方式从服务端获取最新的扫码信息,来判断用户是否已经......
  • 住宅代理IP连接不上?解决排查方法集合
    住宅代理在现代互联网使用中起着至关重要的作用,它们用于各种目的,从在线隐私保护到数据收集,再到跨地理位置访问。然而,在配置到手机/电脑等设备时你可能会遇到住宅代理不起作用的情况。这可能是由多种因素造成的,所以让我们来看看可能的原因以及如何处理它们。一、住宅代理不可......
  • TikTok网络无法连接?4个方法解决它
    “Nonetworkconnection”!当你信心满满下载并准备开始运营TikTok时,屏幕上如果提示“无互联网连接”非常难办。有很多因素可能会导致此问题,包括网络连接无效、应用程序故障等。接下来将为你盘点主要的原因与解决方法。一、无网络连接的原因1、地区网络限制TikTok作为海外版......
  • 住宅代理IP连接不上?解决排查方法集合
    住宅代理在现代互联网使用中起着至关重要的作用,它们用于各种目的,从在线隐私保护到数据收集,再到跨地理位置访问。然而,在配置到手机/电脑等设备时你可能会遇到住宅代理不起作用的情况。这可能是由多种因素造成的,所以让我们来看看可能的原因以及如何处理它们。一、住宅代理不可......
  • 根据网络连接(文件链接)下载文件到本地
    1publicvoidDownloadFile(stringURL,stringfilename)2{3HttpWebRequestreq=null;4HttpWebResponserep=null;5Streamst=null;6Streamso=null;7try8{9req=(HttpWebRequest)Web......
  • 使用Django-Channels实现websocket通信+大模型对话
    前言最近一直在做这个大模型项目,我选了Django作为框架(现在很多大模型应用都用的FastAPI,不过我已经用习惯Django了)之前使用AspNetCore作为后端的时候,我先后尝试了BlazorServer,WebAPISSE(ServerSentEvent)等方案来实现大模型对话,目前好像SSE是用得比较多的,ChatGPT也......
  • [Python] 通过pymongo连接docker中并开启了副本集的mongodb数据库
    需要指定directConnection=true&authSource=atp-test参数,,否则会报连接副本集超时。在PyMongo中,directConnection参数可以决定客户端是否直接连接到MongoDB服务器,而不是自动发现所有的副本集成员。当directConnection设置为true时,客户端将只连接到MongoDB连接字符......