当前位置: 首页 > news >正文

前端实现websocket通信讲解(vue2框架)

websocket:

  • WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)
  • 它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的
  • Websocket是一个持久化的协议

websocket提供的api:

// 连接成功后的回调函数
ws.onopen = function (params) {console.log('客户端连接成功')// 向服务器发送消息ws.send('hello')
};// 从服务器接受到信息时的回调函数
ws.onmessage = function (e) {console.log('收到服务器响应', e.data)
};// 连接关闭后的回调函数
ws.onclose = function(evt) {console.log("关闭客户端连接");
};// 连接失败后的回调函数
ws.onerror = function (evt) {console.log("连接失败了");
};// 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,这样服务端会抛异常。
window.onbeforeunload = function() {ws.close();
}  

一、首先写一个websocket的工具,方便直接调用websocket方法

/*** websocket创建*/export function websocket() {return new Promise((res, req) => {if ('WebSocket' in window) {const ws = new WebSocket(`${'wss://'+ document.location.host+'/ws/notify_warning/'}`)
//这里用的document.location.host取url地址,在调试时也可以先写死,wss还是ws需要和后端同事确认res(ws)} else {req('您的浏览器不支持 WebSocket!')}})
}

二、写一个状态机来管理数据,将后端传来的数据存到state.message

import { websocket } from '@/utils/websocket'
import store from './../index'
import { getToken } from '@/utils/auth' // get token from cookieconst state = {message: {},ws: null
}const mutations = {SET_MESSAGE: (state, message) => {state.message = message},SET_WS: (state, ws) => {state.ws = ws}
}const actions = {websocketMsg({ commit }) {return new Promise((resolve, reject) => {websocket().then((ws) => {commit('SET_WS', ws)ws.onopen = function() {// Web Socket 已连接上,使用 send() 方法发送数据ws.send('发送数据')}ws.onmessage = function(evt) {var received_msg = evt.datacommit('SET_MESSAGE', received_msg)}ws.onerror = function(error) {reject(error)}ws.onclose = function() {// 关闭 websocket// alert("连接已关闭...");if (getToken()) {store.dispatch('message/websocketMsg')}}resolve()})})}
}export default {namespaced: true,state,mutations,actions
}

三、在合适的地方去调用:

 try {await store.dispatch("message/websocketMsg");} 
catch (err) {}

http://www.lryc.cn/news/318572.html

相关文章:

  • 解决ffmpeg播放摄像头延时的问题(项目案例使用有效)
  • Android 音频系统
  • Java必须掌握的二叉堆知识点(含面试大厂题含源码)
  • [Java、Android面试]_03_java内存管理:虚拟内存、堆、垃圾回收
  • PTA题解 --- 求整数段和(C语言)
  • virsh管理虚拟机的命令行工具
  • 数据集成平台选型建议
  • Centos8安装Docker,使用阿里云源
  • FFmpeg概念和简单使用
  • OJ_最长公共子序列
  • SpringBoot拦截器获取token用户对象优雅地传递到Controller层
  • 从零开始学HCIA之SDN03
  • C语言深度理解之——结构体内存对齐
  • LeetCode 热题 100 | 回溯(二)
  • 混合内容错误https中加载了http
  • 游戏免费下载平台模板源码
  • 鸿蒙视频播放的实现
  • QT----计算器
  • Linux:kubernetes(k8s)Deployment的操作(13)
  • 20240619-James-快速鸟瞰并发编程, 呕心沥血整理的架构技术(第3篇)
  • C语言——详解字符函数和字符串函数(一)
  • 三款内衣洗衣机的顶级较量:希亦、小吉、由利,谁才是性价比之王?
  • Java枚举多值映射应用
  • css--浮动
  • 基于有限状态机开发健壮的Nodejs/TCP客户端
  • javaEE13(网站第8章两个课后题)
  • 【Leetcode每日一题】 递归 - 反转链表(难度⭐)(35)
  • Unity基础学习
  • Java并发编程学习笔记:AQS
  • Github上哪些好用的工具