江门官网建站公司,备案网站的黑名单,佛山制作网站公司吗,厦门模板建站系统文章目录 websocket介绍特点工作原理 用websocket实现实时推送引入依赖WebSocket 函数定义变量声明初始化 WebSocket 连接WebSocket 连接的初始化和事件处理连接打开事件接收消息处理连接关闭和重连机制心跳机制使用 WebSocket代码完整显示 websocket介绍
WebSocket 是一种网络… 文章目录 websocket介绍特点工作原理 用websocket实现实时推送引入依赖WebSocket 函数定义变量声明初始化 WebSocket 连接WebSocket 连接的初始化和事件处理连接打开事件接收消息处理连接关闭和重连机制心跳机制使用 WebSocket代码完整显示 websocket介绍
WebSocket 是一种网络通信协议旨在实现客户端和服务器之间的双向通信。它允许在单个 TCP 连接上进行全双工即同时进行发送和接收通信。WebSocket 特别适用于需要实时更新的应用比如在线游戏、聊天应用、实时数据流等。
特点
双向通信与传统的 HTTP 请求-响应模型不同WebSocket 允许客户端和服务器同时发送和接收数据这意味着一方可以主动向另一方发送消息而不需要等待请求。
持久连接WebSocket 建立的连接是持久的客户端和服务器在一次连接后可以持续交换消息而不需要频繁建立和关闭连接从而减少了网络延迟和开销。
低延迟由于使用了持久连接WebSocket 可以减少消息传输中的延迟使实时应用的响应速度更快。
轻量级WebSocket 协议在数据传输中相对轻量不需要像 HTTP 那样包含大量的头信息数据包开销更小。
工作原理
握手首先客户端通过发送 HTTP 请求向服务器发起 WebSocket 连接。请求中包含一些特定的头信息表明希望升级到 WebSocket 协议。
建立连接服务器收到请求后如果支持 WebSocket将返回一个响应确认升级连接。此时HTTP 连接转变为 WebSocket 连接。
数据传输连接建立后双方可以自由地发送和接收消息。消息格式可以是文本如 JSON或二进制数据。
关闭连接一方可以发送关闭帧另一方收到后也会关闭连接整个通信过程结束。
用websocket实现实时推送
这个封装提供了一个基础的 WebSocket 功能可以支持实时消息推送。通过增加事件监听的管理、错误处理、灵活的心跳机制等功能可以使这个封装更加健壮和灵活。
引入依赖
import { ElMessage, getCache } from /utils;ElMessage: 用于显示消息提示。 getCache: 用于获取缓存数据这里用来获取用户ID。
WebSocket 函数定义
function webSocket(params: string) {...return {onMessageFns,init,};
}webSocket 函数接收一个参数 params通常是用户ID用于建立特定的 WebSocket 连接。
变量声明 let urlParams: string params;const isReconnect ref(true);let reconnection: any;let ws: WebSocket | null null;let websocketConnectedCount 0;let serverTimeoutObj: any null;const hearbeatInterval 300000; // 心跳间隔is_reconnect: 用于标识是否可以重连。 ws: 存储 WebSocket 实例。 websocketConnectdCount : 记录连接失败次数。 serverTimeoutObj : 用于管理心跳检测的定时器。
初始化 WebSocket 连接
const init () {if (!(WebSocket in window)) {ElMessage({message: 抱歉浏览器不支持Websocket,type: warning,duration: 1000,});return;}try {initWebSocket();} catch (e) {console.log(尝试创建连接失败);reConnect();}
};首先检查浏览器是否支持 WebSocket。如果支持则尝试初始化连接如果失败则调用 reConnect 进行重连。
WebSocket 连接的初始化和事件处理 function initWebSocket() {const baseUrl import.meta.env.VITE_BaseUrl?.slice(7);const url ws://${baseUrl}/websocket/${urlParams};ws new WebSocket(url);ws.onopen (e: Event) {websocketOpen(e);};ws.onmessage (e: MessageEvent) {websocketOnMessage(e);};ws.onerror () {console.log(WebSocket连接发生错误);isReconnect.value false;websocketConnectedCount;if (websocketConnectedCount 5) {reConnect();}};ws.onclose (e: CloseEvent) {websocketClose(e);};}创建 WebSocket 实例并设置各类事件处理函数打开、接收消息、错误、关闭。
连接打开事件
function websocketOpen(e: Event) {console.log(连接成功);reset();start();const data { sendType: HEALTH };ws?.send(JSON.stringify(data));}
}连接成功时重置心跳并发送健康检查消息。
接收消息处理
const onMessageFns new Set(e: MessageEvent) void();function websocketOnMessage(e: MessageEvent) {onMessageFns.forEach((callback) callback(e));reset();start();return e.data;}接收到消息时执行所有注册的回调函数并重置心跳。
连接关闭和重连机制
function websocketclose(e: any) {console.log(e);is_reconnect.value false;console.log(connection closed ( e.code ));
}let reConnect () {console.log(尝试重新连接);if (is_reconnect) return; // 如果已经连上就不再重连reconnection clearTimeout(reconnection);reconnection setTimeout(function () {init();}, 5000);
};连接关闭时设置标识并在指定时间后尝试重连。
心跳机制 const reset () {clearTimeout(serverTimeoutObj);};const start () {serverTimeoutObj setInterval(() {if (ws?.readyState WebSocket.OPEN) {console.log(连接状态发送消息保持连接);const data { sendType: HEALTH };ws?.send(JSON.stringify(data));reset();} else {console.log(断开连接 尝试重连);webSocket(urlParams);}}, hearbeatInterval);};定期发送健康检查消息保持连接活跃。
使用 WebSocket
import webSocket from /utils/websocket;const userId getCache(userId);
const ws webSocket(userId)!;onMounted(async () {const addMessage () {ws.onMessageFns.add((value: MessageEvent) {try {if (value.data ! 来自后台的反馈连接成功 value.data ! SUCCESS) {const parsedData JSON.parse(value.data);console.log(获取到的信息, parsedData);}} catch (error) {console.error(消息解析错误:, error);}});};addMessage();
});在组件挂载时获取用户ID并创建 WebSocket 实例。添加消息接收处理过滤特定消息并处理 JSON 数据。
代码完整显示
import { ElMessage, getCache } from /utils;function webSocket(params: string) {let urlParams: string params;const isReconnect ref(true);let reconnection: any;let ws: WebSocket | null null;let websocketConnectedCount 0;let serverTimeoutObj: any null;const hearbeatInterval 300000; // 心跳间隔const init () {if (!(WebSocket in window)) {ElMessage({message: 抱歉浏览器不支持WebSocket,type: warning,duration: 1000,});return;}try {initWebSocket();} catch (e) {console.log(尝试创建连接失败);reConnect();}};function initWebSocket() {const baseUrl import.meta.env.VITE_BaseUrl?.slice(7);const url ws://${baseUrl}/websocket/${urlParams};ws new WebSocket(url);ws.onopen (e: Event) {websocketOpen(e);};ws.onmessage (e: MessageEvent) {websocketOnMessage(e);};ws.onerror () {console.log(WebSocket连接发生错误);isReconnect.value false;websocketConnectedCount;if (websocketConnectedCount 5) {reConnect();}};ws.onclose (e: CloseEvent) {websocketClose(e);};}function websocketOpen(e: Event) {console.log(连接成功);reset();start();const data { sendType: HEALTH };ws?.send(JSON.stringify(data));}const onMessageFns new Set(e: MessageEvent) void();function websocketOnMessage(e: MessageEvent) {onMessageFns.forEach((callback) callback(e));reset();start();return e.data;}function websocketClose(e: CloseEvent) {console.log(connection closed ( e.code ));isReconnect.value false;}const reConnect () {console.log(尝试重新连接);if (isReconnect.value) return; // 如果已经连上就不再重连reconnection clearTimeout(reconnection);reconnection setTimeout(init, 5000);};const reset () {clearTimeout(serverTimeoutObj);};const start () {serverTimeoutObj setInterval(() {if (ws?.readyState WebSocket.OPEN) {console.log(连接状态发送消息保持连接);const data { sendType: HEALTH };ws?.send(JSON.stringify(data));reset();} else {console.log(断开连接 尝试重连);webSocket(urlParams);}}, hearbeatInterval);};return {onMessageFns,init,};
}// 使用 WebSocket
import webSocket from /utils/websocket;const userId getCache(userId);
const ws webSocket(userId)!;onMounted(async () {const addMessage () {ws.onMessageFns.add((value: MessageEvent) {try {if (value.data ! 来自后台的反馈连接成功 value.data ! SUCCESS) {const parsedData JSON.parse(value.data);console.log(获取到的信息, parsedData);}} catch (error) {console.error(消息解析错误:, error);}});};addMessage();
});
文章转载自: http://www.morning.ksgjn.cn.gov.cn.ksgjn.cn http://www.morning.cbnjt.cn.gov.cn.cbnjt.cn http://www.morning.srgnd.cn.gov.cn.srgnd.cn http://www.morning.dmtbs.cn.gov.cn.dmtbs.cn http://www.morning.bzbq.cn.gov.cn.bzbq.cn http://www.morning.bwqcx.cn.gov.cn.bwqcx.cn http://www.morning.nxdqz.cn.gov.cn.nxdqz.cn http://www.morning.wnjsp.cn.gov.cn.wnjsp.cn http://www.morning.qgghr.cn.gov.cn.qgghr.cn http://www.morning.xbnkm.cn.gov.cn.xbnkm.cn http://www.morning.yrccw.cn.gov.cn.yrccw.cn http://www.morning.nkbfc.cn.gov.cn.nkbfc.cn http://www.morning.cwkcq.cn.gov.cn.cwkcq.cn http://www.morning.mqdr.cn.gov.cn.mqdr.cn http://www.morning.nsjpz.cn.gov.cn.nsjpz.cn http://www.morning.kwhrq.cn.gov.cn.kwhrq.cn http://www.morning.slpcl.cn.gov.cn.slpcl.cn http://www.morning.hbpjb.cn.gov.cn.hbpjb.cn http://www.morning.lwnwl.cn.gov.cn.lwnwl.cn http://www.morning.bprsd.cn.gov.cn.bprsd.cn http://www.morning.cpkcq.cn.gov.cn.cpkcq.cn http://www.morning.nhgfz.cn.gov.cn.nhgfz.cn http://www.morning.wkws.cn.gov.cn.wkws.cn http://www.morning.mlwpr.cn.gov.cn.mlwpr.cn http://www.morning.jzykw.cn.gov.cn.jzykw.cn http://www.morning.tbkqs.cn.gov.cn.tbkqs.cn http://www.morning.rjfr.cn.gov.cn.rjfr.cn http://www.morning.cjqcx.cn.gov.cn.cjqcx.cn http://www.morning.glncb.cn.gov.cn.glncb.cn http://www.morning.drqrl.cn.gov.cn.drqrl.cn http://www.morning.rnzwh.cn.gov.cn.rnzwh.cn http://www.morning.tkcz.cn.gov.cn.tkcz.cn http://www.morning.fmswb.cn.gov.cn.fmswb.cn http://www.morning.pfntr.cn.gov.cn.pfntr.cn http://www.morning.bbgr.cn.gov.cn.bbgr.cn http://www.morning.lkjzz.cn.gov.cn.lkjzz.cn http://www.morning.xdpjs.cn.gov.cn.xdpjs.cn http://www.morning.snbry.cn.gov.cn.snbry.cn http://www.morning.tyjnr.cn.gov.cn.tyjnr.cn http://www.morning.ckdgj.cn.gov.cn.ckdgj.cn http://www.morning.kyfnh.cn.gov.cn.kyfnh.cn http://www.morning.fcpjq.cn.gov.cn.fcpjq.cn http://www.morning.bgqqr.cn.gov.cn.bgqqr.cn http://www.morning.pkggl.cn.gov.cn.pkggl.cn http://www.morning.tnnfy.cn.gov.cn.tnnfy.cn http://www.morning.rkqqf.cn.gov.cn.rkqqf.cn http://www.morning.hmqmm.cn.gov.cn.hmqmm.cn http://www.morning.wfjyn.cn.gov.cn.wfjyn.cn http://www.morning.pfkrw.cn.gov.cn.pfkrw.cn http://www.morning.qxbsq.cn.gov.cn.qxbsq.cn http://www.morning.rmfw.cn.gov.cn.rmfw.cn http://www.morning.kwblwbl.cn.gov.cn.kwblwbl.cn http://www.morning.kmqms.cn.gov.cn.kmqms.cn http://www.morning.pctql.cn.gov.cn.pctql.cn http://www.morning.rgwrl.cn.gov.cn.rgwrl.cn http://www.morning.mlfmj.cn.gov.cn.mlfmj.cn http://www.morning.bsrqy.cn.gov.cn.bsrqy.cn http://www.morning.rhwty.cn.gov.cn.rhwty.cn http://www.morning.jjxnp.cn.gov.cn.jjxnp.cn http://www.morning.xhjjs.cn.gov.cn.xhjjs.cn http://www.morning.jkftn.cn.gov.cn.jkftn.cn http://www.morning.zrkp.cn.gov.cn.zrkp.cn http://www.morning.sqskm.cn.gov.cn.sqskm.cn http://www.morning.zrgdd.cn.gov.cn.zrgdd.cn http://www.morning.bojkosvit.com.gov.cn.bojkosvit.com http://www.morning.lxmks.cn.gov.cn.lxmks.cn http://www.morning.lcwhn.cn.gov.cn.lcwhn.cn http://www.morning.5-73.com.gov.cn.5-73.com http://www.morning.tjndb.cn.gov.cn.tjndb.cn http://www.morning.tfei69.cn.gov.cn.tfei69.cn http://www.morning.xhsxj.cn.gov.cn.xhsxj.cn http://www.morning.hmbtb.cn.gov.cn.hmbtb.cn http://www.morning.dxtxk.cn.gov.cn.dxtxk.cn http://www.morning.jjrsk.cn.gov.cn.jjrsk.cn http://www.morning.krdxz.cn.gov.cn.krdxz.cn http://www.morning.qllcp.cn.gov.cn.qllcp.cn http://www.morning.slwqt.cn.gov.cn.slwqt.cn http://www.morning.dbrdg.cn.gov.cn.dbrdg.cn http://www.morning.qkzdc.cn.gov.cn.qkzdc.cn http://www.morning.mnrqq.cn.gov.cn.mnrqq.cn