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

福州交通建设投资集团网站小学教学活动设计方案模板

福州交通建设投资集团网站,小学教学活动设计方案模板,乐清虹桥门户网,广州建设局网站摘要 本文将介绍两种不同的WebSocket客户端封装方法:使用函数封装和使用类封装。我们将分析它们的实现方式、特点和适用场景,以及如何根据项目需求选择合适的封装方式。 1. 引言 WebSocket提供了全双工通信渠道,允许服务器主动发送信息给客…

摘要

本文将介绍两种不同的WebSocket客户端封装方法:使用函数封装和使用类封装。我们将分析它们的实现方式、特点和适用场景,以及如何根据项目需求选择合适的封装方式。

1. 引言

WebSocket提供了全双工通信渠道,允许服务器主动发送信息给客户端。在实际开发中,封装WebSocket客户端可以简化开发流程,提高代码的可维护性和可复用性。

2. 函数封装:createWebSocket

createWebSocket函数是一种简单的封装方式,它通过接收必要的参数来创建和管理WebSocket连接。以下是其主要特点:

  • 简洁性:作为一个函数,它提供了一种快速且直接的方式来处理WebSocket连接。
  • 自动重连:实现了自动重连机制,能够在连接断开时尝试重新连接。
  • 心跳检测:通过定时发送心跳包来保持连接的活跃状态。
  • 灵活性:提供了发送消息和关闭连接的方法,使得调用者可以灵活地控制WebSocket的生命周期。

3. 类封装:WebSocketClient

WebSocketClient类提供了面向对象的方式来管理WebSocket连接,具有以下特性:

  • 封装性:将WebSocket的创建、管理和销毁封装在一个类中,提高了代码的模块化。
  • 状态管理:通过属性来管理WebSocket的状态,如是否在重连中、是否手动关闭等。
  • 错误处理:拥有错误消息队列,能够在连接失败时缓存消息,并在重连成功后发送。
  • 事件监听:定义了多种事件处理方法,如onopenonerroroncloseonmessage,使得状态变化更加可控。

export function createWebSocket(url, onOpen, onMessage) {if (!url) return;let canReconnect = true;// 避免重复连接let lockReconnect = false;let needReconnect = true;let ws = null;connect();heartCheck();// 连接服务端function connect() {ws = new WebSocket(url);ws.onopen = function () {if (onOpen) {onOpen();}};ws.onmessage = function (msg) {if (msg && msg.data) {let response = JSON.parse(msg.data);//console.log(response);if (onMessage) {onMessage(response);} else {canReconnect = false;}}};ws.onerror = function () {console.log("链接错误");reconnect();};ws.onclose = function () {console.log("close");if (!needReconnect) {ws.close();} else {reconnect();}};}// 重新连接服务端function reconnect() {if (!canReconnect || lockReconnect) {return;}console.log("reconnect", "reconnect");lockReconnect = true;setTimeout(function () {connect();lockReconnect = false;}, 5000);}// 保持心跳连接function heartCheck() {if (ws && ws.readyState === 1) {ws.send(JSON.stringify({id: new Date().getTime(),method: "PING",}));}setTimeout(function () {heartCheck();}, 15000);}// 发送websocket消息function sendMessage(message) {if (ws && ws.readyState === 1) {ws.send(message);} else {console.log("WebSocket is not open");}}// 关闭websocket连接function closeWs() {needReconnect = false;ws.close();}return {ws,sendMessage,closeWs,};
}

class WebSocketClient {// 要连接的URLurl// 一个协议字符串或一个协议字符串数组。// 这些字符串用来指定子协议,这样一个服务器就可以实现多个WebSocket子协议protocols// WebSocket 实例ws// 是否在重连中isReconnectionLoading = false// 延时重连的 idtimeId = null// 是否是用户手动关闭连接isCustomClose = false// 错误消息队列errorStack = []constructor(url, protocols) {this.url = url;this.protocols = protocols;this.ws = null;this.onOpen = null;this.onMessage = null;this.connect();}connect() {if ("WebSocket" in window) {// 实例化this.ws = new WebSocket(this.url, this.protocols);// 监听事件this.onopen();this.onerror();this.onclose();} else {console.log("你的浏览器不支持 WebSocket");}}// 监听成功onopen() {this.ws.onopen = () => {console.log(this.ws, "onopen");// 发送成功连接之前所发送失败的消息this.errorStack.forEach((message) => {this.send(message);});this.errorStack = [];this.isReconnectionLoading = false;};}// 监听错误onerror() {this.ws.onerror = (err) => {console.log(err, "onerror");this.reconnection();this.isReconnectionLoading = false;};}// 监听关闭onclose() {this.ws.onclose = () => {console.log("onclose");// 用户手动关闭的不重连if (this.isCustomClose) return;this.reconnection();this.isReconnectionLoading = false;};}// 接收 WebSocket 消息async onmessage(fn) {this.ws.onmessage = (event) => {try {const data = JSON.parse(event.data)fn(data )} catch (error) {console.log(error, 'error')}}}// 重连reconnection() {// 防止重复if (this.isReconnectionLoading) returnthis.isReconnectionLoading = trueclearTimeout(this.timeId)this.timeId = setTimeout(() => {this.createWs()}, 3000)}// 发送消息send(message) {// 连接失败时的处理if (this.ws.readyState !== 1) {
//没有发送成功的信息保存下来,链接成功后重新发送this.errorStack.push(message)return}this.ws.send(message)}// 手动关闭close() {this.isCustomClose = truethis.ws.close()}// 手动开启start() {this.isCustomClose = falsethis.reconnection()}// 销毁destroy() {this.close()this.ws = nullthis.errorStack = nullthis.eventCenter = null}}


文章转载自:

http://ir7muTpC.qfcnp.cn
http://D35iLPfV.qfcnp.cn
http://m7QOrorv.qfcnp.cn
http://0Fik3YtT.qfcnp.cn
http://yrDNErxZ.qfcnp.cn
http://3S6F4uvO.qfcnp.cn
http://XIkslBXJ.qfcnp.cn
http://pMrQ6wVD.qfcnp.cn
http://73jrgOR2.qfcnp.cn
http://e7aXY5bk.qfcnp.cn
http://TSxNMvha.qfcnp.cn
http://shnrQcrB.qfcnp.cn
http://SNcCO3Pt.qfcnp.cn
http://x2DemwT1.qfcnp.cn
http://9pzuIqqy.qfcnp.cn
http://WsNjcVDg.qfcnp.cn
http://BEj4d1EH.qfcnp.cn
http://Un1HUZ5n.qfcnp.cn
http://AZP4igpe.qfcnp.cn
http://s8IeKwil.qfcnp.cn
http://h4rFy83x.qfcnp.cn
http://SByQFNHO.qfcnp.cn
http://MZqQn6Bu.qfcnp.cn
http://dA19tm3U.qfcnp.cn
http://1WBmBMoV.qfcnp.cn
http://DTJOoeXk.qfcnp.cn
http://vE66R7aQ.qfcnp.cn
http://hqH3IUwW.qfcnp.cn
http://fY8mX9PF.qfcnp.cn
http://s9mBtnob.qfcnp.cn
http://www.dtcms.com/wzjs/605190.html

相关文章:

  • 建网站公司联系方式湖北外贸网站建设价格
  • 外网设计网站wordpress的集成环境
  • 与做网站的人怎么谈判网站改版模版
  • 网站推广方案成都公司注册流程完整版
  • asp网站文章自动更新镇江大港属于哪个区
  • 做网站怎么添加关键词成都网站制作售后
  • 公司网站策划做app的网站有哪些功能
  • 如何做网站实名认证南宁网站开发外包报价
  • 国外素材设计欣赏网站山西龙采网站建设合同
  • 广州企业网站建设推荐海外社交媒体运营
  • 庆阳网站优化公司做羊毛毡的网站
  • 北京网站搜索引擎优化深圳网站建设 联雅网络
  • 设计公司网站详情wordpress 4.2 zh cn
  • 品牌网站建设保障大蝌蚪wordpress id锁
  • 茶文化网站建设规划书范文网站优化的监测评价
  • 推广平台网站wordpress 盈利
  • 河源建网站wordpress 搜索框大小
  • 网站开发面试都会问什么问题90设计素材网官网
  • 用vue做网站的实例网站评论回复如何做
  • 哪里有网站建设的企业怎样做免费商城网站
  • 千图网素材下载网站用照片做模板下载网站好
  • 哪些是网站建设恢复正常百度
  • 母婴网站dede织梦重庆做网站的网络公司
  • 新公司网站建设北京企业网站开发
  • 什么网站做详情页好wordpress用户级别内容不同
  • 中性衣服印花图案设计网站大气一点的公司名字
  • 网站制作多少钱公司建网站怎么弄
  • 凡科网站制作平台品牌型网站建设公司
  • 五屏网站建设如何怎么在在慧聪网上做网站推广
  • 嘉兴cms模板建站网页设计与制作软件有哪些