【前端】websocket 讲解与项目中的使用

简介: 【前端】websocket 讲解与项目中的使用


1、SSE(Server-sent Events)

SSE(Server-sent Events)是 WebSocket 的一种轻量代替方案,使用 HTTP 协议。 => Server-Sent Events 教程

2、stomp 介绍

3、MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议

MQTT JavaScript 客户端库

MQTT 入门介绍

4、课外阅读:[WebSocket 是什么原理?为什么可以实现持久连接?

]( )

源代码

==================================================================
import { EventLsbridge } from ‘@/common/eventLsbridge’
import { loadFromSession } from ‘@/common/session-storage’
import { Message } from ‘element-ui’
const timer = {
reconnectObj: null,
wsTimeoutObj: null,
serverTimeoutObj: null,
// 重连时间间隔(s)
reconnectTime: 3
}
const state = {
ws: null,
// 心跳时间(s)
wsTimeout: 20,
// 等待心跳响应时间(s),等待心跳的响应时间要大于心跳时间4s以上
waitHeartTime: 24
}
const mutations = {
set_reconnectObj: (state, val) => {
state.reconnectObj = val
},
}
const actions = {
// 心跳重置
wsHearReset({ dispatch }) {
clearTimeout(timer.serverTimeoutObj)
clearTimeout(timer.wsTimeoutObj)
dispatch(‘wsHeartStart’)
},
// 开启心跳
wsHeartStart({ state, dispatch }) {
timer.wsTimeoutObj = setTimeout(() => {
if(state.ws && state.ws.readyState == 1) {
state.ws.send(‘’)
} else {
dispatch(‘handlerWSError’)
}
}, state.wsTimeout * 1000)
timer.serverTimeoutObj = setTimeout(() => {
console.log(‘接收心跳异常!’)
dispatch(‘handlerWSError’)
}, state.waitHeartTime * 1000)
},
// 初始化ws连接
initWebsocket({ dispatch, state }) {
if (state.ws) {
return
} else {
return new Promise(resolve => {
let url = ${process.env['VUE_APP_WEBSOCKET']}/websocket
state.ws = new WebSocket(url)
state.ws.addEventListener(‘open’, e => {
console.log(‘长连接连接成功’)
clearTimeout(timer.reconnectObj)
dispatch(‘wsHeartStart’)
})
state.ws.addEventListener(‘message’, e => {
dispatch(‘wsHearReset’)
dispatch(‘handlerWSMessage’, e)
})
state.ws.addEventListener(‘close’, e => {
console.log(‘ws close’)
dispatch(‘handlerWSClose’, e)
})
state.ws.addEventListener(‘error’, e => {
console.log(‘ws error’)
dispatch(‘handlerWSError’, e)
})
})
}
},
handlerSend({state}, id = -1) {
if(!state.ws) {
return
}
if(state.ws.readyState == 1) {
state.ws.send(
JSON.stringify({
id
})
)
}
},
handlerWSClose({ state }, e) {
state.ws?.close()
},
handlerWSError({state, dispatch}, e) {
console.log(‘ws-error’)
state.ws?.close()
state.ws = null
dispatch(‘reconnect’)
},
reconnect({state, commit, dispatch}) {
console.log(‘ws-重连’)
clearTimeout(timer.wsTimeoutObj)
clearTimeout(timer.serverTimeoutObj)
clearTimeout(timer.reconnectObj)
if (loadFromSession(‘userInfo’)?.userId) {
Message.warning(‘网络出现异常,请检查网络后尝试刷新页面’)
}
timer.reconnectObj = window.setTimeout(() => {
dispatch(‘initWebsocket’)
timer.reconnectTime += 4
if(timer.reconnectTime > 60) {
timer.reconnectTime = 20
}
}, timer.reconnectTime * 1000)
},
// ws回调
handlerWSMessage({state}, e) {
let respData = {}
try {
respData = JSON.parse(e.data)
} catch (e) {
// not todo
}
if (respData?.data) {
EventLsbridge.vueEmit(EventLsbridge.eventName.wsData, respData)
}
}
}
export default {
namespaced: true,
state,
mutations,
actions
}
相关文章
|
2月前
|
前端开发 JavaScript 定位技术
一、前端高德地图注册、项目中引入、渲染标记(Marker)and覆盖物(Circle)
文章介绍了如何在前端项目中注册并使用高德地图API,包括注册高德开放平台账号、引入高德地图到项目、以及如何在地图上渲染标记(Marker)和覆盖物(Circle)。
62 1
|
7天前
|
JavaScript 前端开发 Docker
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
在使用 Deno 构建项目时,生成的可执行文件体积较大,通常接近 100 MB,而 Node.js 构建的项目体积则要小得多。这是由于 Deno 包含了完整的 V8 引擎和运行时,使其能够在目标设备上独立运行,无需额外安装依赖。尽管体积较大,但 Deno 提供了更好的安全性和部署便利性。通过裁剪功能、使用压缩工具等方法,可以优化可执行文件的体积。
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
|
6天前
|
JavaScript 前端开发 测试技术
前端全栈之路Deno篇(五):如何快速创建 WebSocket 服务端应用 + 客户端应用 - 可能是2025最佳的Websocket全栈实时应用框架
本文介绍了如何使用Deno 2.0快速构建WebSocket全栈应用,包括服务端和客户端的创建。通过一个简单的代码示例,展示了Deno在WebSocket实现中的便捷与强大,无需额外依赖,即可轻松搭建具备基本功能的WebSocket应用。Deno 2.0被认为是最佳的WebSocket全栈应用JS运行时,适合全栈开发者学习和使用。
|
27天前
|
前端开发 JavaScript 应用服务中间件
linux安装nginx和前端部署vue项目(实际测试react项目也可以)
本文是一篇详细的教程,介绍了如何在Linux系统上安装和配置nginx,以及如何将打包好的前端项目(如Vue或React)上传和部署到服务器上,包括了常见的错误处理方法。
71 0
linux安装nginx和前端部署vue项目(实际测试react项目也可以)
|
8天前
|
缓存 前端开发 JavaScript
前端架构思考:代码复用带来的隐形耦合,可能让大模型造轮子是更好的选择-从 CDN 依赖包被删导致个站打不开到数年前因11 行代码导致上千项目崩溃谈谈npm黑洞 - 统计下你的项目有多少个依赖吧!
最近,我的个人网站因免费CDN上的Vue.js包路径变更导致无法访问,引发了我对前端依赖管理的深刻反思。文章探讨了NPM依赖陷阱、开源库所有权与维护压力、NPM生态问题,并提出减少不必要的依赖、重视模块设计等建议,以提升前端项目的稳定性和可控性。通过“left_pad”事件及个人经历,强调了依赖管理的重要性和让大模型代替人造轮子的潜在收益
|
14天前
|
前端开发 JavaScript 开发工具
前端代码规范和质量是确保项目可维护性、可读性和可扩展性的关键(三)
前端代码规范和质量是确保项目可维护性、可读性和可扩展性的关键(三)
25 0
|
14天前
|
Web App开发 前端开发 JavaScript
前端代码规范和质量是确保项目可维护性、可读性和可扩展性的关键(二)
前端代码规范和质量是确保项目可维护性、可读性和可扩展性的关键(二)
31 0
|
14天前
|
Web App开发 移动开发 前端开发
前端代码规范和质量是确保项目可维护性、可读性和可扩展性的关键(一)
前端代码规范和质量是确保项目可维护性、可读性和可扩展性的关键(一)
34 0
|
15天前
|
前端开发 API 开发者
🥇前端宝藏:多项目掌握技能的冒险之旅🏆
在前端开发的学习旅程中,实践是提升技能的关键。本文介绍了多个前端项目,包括计算器、天气应用、经典游戏等,涵盖了从React到Svelte的各种技术栈。每个项目都附有在线演示和源代码,旨在帮助读者深入理解实现细节,激励更多人参与实际项目开发。通过这些项目,读者可以将理论知识转化为实践,拓展职业机会。
11 0
|
2月前
|
前端开发 Python
前后端分离的进化:Python Web项目中的WebSocket实时通信解决方案
在现代Web开发领域,前后端分离已成为一种主流架构模式,它促进了开发效率、提升了应用的可维护性和可扩展性。随着实时数据交互需求的日益增长,WebSocket作为一种在单个长连接上进行全双工通讯的协议,成为了实现前后端实时通信的理想选择。在Python Web项目中,结合Flask框架与Flask-SocketIO库,我们可以轻松实现WebSocket的实时通信功能。
50 2