vue封装websocket兼心跳检测
创建socker.js文件, 放在utils文件夹下
socket.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | var ws= null ; //建立的连接 var lockReconnect= false ; //是否真正建立连接 var timeout= 3*1000; //30秒一次心跳 var timeoutObj= null ; //心跳心跳倒计时 var serverTimeoutObj= null ; //心跳倒计时 var timeoutnum= null ; //断开 重连倒计时 var global_callback = null ; //监听服务端消息 // uri: 长链接地址<br>// jwt: 前后端连接凭证, 按需添加<br>// callback: 服务端消息回调函数 export function createWebscoket(uri, jwt, callback) { global_callback = callback ws = new WebSocket(uri, [jwt]) ws.onopen = ()=>{ lockReconnect = true //开启连接心跳 start() } ws.onmessage = onMessage ws.onerror = onError ws.onclose = onClose ws.onsend = onSend } //发送消息 export function onSend(message){ console.log(`发送消息: ${message}`) ws.send(message) } //接受服务端消息 export function onMessage(res){ let msgData = res.data if ( typeof msgData != 'object' && msgData != 'Connect success' ) { var data = msgData.replace(/\ufeff/g, "" ); var message = JSON.parse(data) //服务端消息回掉 global_callback(message) //重置心跳 reset() } } //连接失败 export function onError(){ console.log( '连接失败' ) ws.close() ws = null lockReconnect = false } //连接关闭 export function onClose(){ console.log( '连接关闭' ) } //断开关闭 export function closeWs(){ if (lockReconnect) { ws.close() ws = null lockReconnect = false } } // 发送心跳 export function start () { timeoutObj && clearTimeout(timeoutObj); serverTimeoutObj && clearTimeout(serverTimeoutObj); timeoutObj = setTimeout( function (){ //这里发送一个心跳,后端收到后,返回一个心跳消息 if (ws.readyState == 1) { //如果连接正常 ws.send(JSON.stringify({ "action" : "ROOM_KEEP_CONNECTION" })); } else { //否则重连 reconnect() } serverTimeoutObj = setTimeout( function () { //超时关闭 ws.close(); }, timeout ); }, timeout+ 3000) } //重置心跳 export function reset(){ var that = this ; //清除时间 clearTimeout(timeoutObj); //清除时间 clearTimeout(serverTimeoutObj); start(); //重启心跳 } //重新连接 export function reconnect() { if (lockReconnect) { return ; }; lockReconnect = true ; //没连接上会一直重连,设置延迟避免请求过多 timeoutnum && clearTimeout(timeoutnum); timeoutnum = setTimeout( function () { createWebscoket(); //新连接 lockReconnect = false ; },5000); } |
页面或组件内调用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import { createWebscoket, onSend, closeWs } from '@/utils/socket.js' data(){ return { socketMsg: '' } }, created(){ this .initWebsocket() }, methods: { //连接socket initWebsocket() { createWebscoket(uri, this .jwt, this .messagesCallBack) }, //新消息监听 messagesCallBack(msg){ this .socketMsg = msg }, //发送socket消息到服务器 sendMessage(){ onSend(JSON.stringift({ data: '要发送的消息' })) }, //断开socket closeWs(){ closeWs() } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现