您现在的位置是:首页 > 技术教程 正文

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

admin 阅读: 2024-03-31
后台-插件-广告管理-内容页头部广告(手机)

前言:最近接到的需求是前端需要实现一个全局告警弹窗,如果使用ajax请求http接口只能用定时器定时去请求是否有告警,这样既消耗资源,又不能实时监测到告警信息。所以这个时候就可以采用websocket来实现通信,因为websocket不用请求一次才响应一次,它可以实现服务器主动发送。

websocket:

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

websocket提供的api:

  1. // 连接成功后的回调函数
  2. ws.onopen = function (params) {
  3. console.log('客户端连接成功')
  4. // 向服务器发送消息
  5. ws.send('hello')
  6. };
  7. // 从服务器接受到信息时的回调函数
  8. ws.onmessage = function (e) {
  9. console.log('收到服务器响应', e.data)
  10. };
  11. // 连接关闭后的回调函数
  12. ws.onclose = function(evt) {
  13. console.log("关闭客户端连接");
  14. };
  15. // 连接失败后的回调函数
  16. ws.onerror = function (evt) {
  17. console.log("连接失败了");
  18. };
  19. // 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,这样服务端会抛异常。
  20. window.onbeforeunload = function() {
  21. ws.close();
  22. }

接下来陈列一个vue2项目内使用websocket的过程:

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

目录 

websocket.js代码:

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

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

  1. import { websocket } from '@/utils/websocket'
  2. import store from './../index'
  3. import { getToken } from '@/utils/auth' // get token from cookie
  4. const state = {
  5. message: {},
  6. ws: null
  7. }
  8. const mutations = {
  9. SET_MESSAGE: (state, message) => {
  10. state.message = message
  11. },
  12. SET_WS: (state, ws) => {
  13. state.ws = ws
  14. }
  15. }
  16. const actions = {
  17. websocketMsg({ commit }) {
  18. return new Promise((resolve, reject) => {
  19. websocket().then((ws) => {
  20. commit('SET_WS', ws)
  21. ws.onopen = function() {
  22. // Web Socket 已连接上,使用 send() 方法发送数据
  23. ws.send('发送数据')
  24. }
  25. ws.onmessage = function(evt) {
  26. var received_msg = evt.data
  27. commit('SET_MESSAGE', received_msg)
  28. }
  29. ws.onerror = function(error) {
  30. reject(error)
  31. }
  32. ws.onclose = function() {
  33. // 关闭 websocket
  34. // alert("连接已关闭...");
  35. if (getToken()) {
  36. store.dispatch('message/websocketMsg')
  37. }
  38. }
  39. resolve()
  40. })
  41. })
  42. }
  43. }
  44. export default {
  45. namespaced: true,
  46. state,
  47. mutations,
  48. actions
  49. }

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

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

这样websocket传过来的值就存在了message中,可以将其渲染在页面中

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索
排行榜