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

能在线做国二计算机题目的网站做明星网站打广告

能在线做国二计算机题目的网站,做明星网站打广告,wordpress浮动快捷,seo软件定制本文介绍如何通过原生WebSocket API封装一个具备自动重连、心跳检测、错误恢复等能力的稳健客户端。适用于需要长连接的实时通讯场景(如聊天室、实时数据监控等)。 核心功能亮点 自动重连机制 - 指数退避策略重连心跳保活 - 双向检测连接活性消息可靠性…

本文介绍如何通过原生WebSocket API封装一个具备自动重连、心跳检测、错误恢复等能力的稳健客户端。适用于需要长连接的实时通讯场景(如聊天室、实时数据监控等)。

核心功能亮点

  1. 自动重连机制 - 指数退避策略重连
  2. 心跳保活 - 双向检测连接活性
  3. 消息可靠性 - 失败消息自动重发
  4. 异常处理 - 错误分类处理机制
  5. 状态管理 - 精准控制连接生命周期   
  6. 关键优化点说明

  7. 事件监听优化

    • 改用addEventListener替代onopen等属性赋值,允许多监听器共存
    • 新增错误边界处理,防止初始化失败导致程序崩溃
  8. 智能重连策略

    • 避免网络恢复后仍要等待过长的延迟时间
  9. 状态管理改进

    • 通过属性访问器清晰管理连接状态
  10. 消息可靠性增强

    • 独立队列存储未发送消息
    • 连接恢复时自动重发
  11. 配置与状态分离

    • 独立config对象管理配置参数
    • state对象清晰反映运行时状态
  12.  
    /*** WebSocket客户端实现* @param {string} url - 连接地址* @param {string|string[]} [protocols] - 可选协议*/
    class WebSocketClient {// 默认配置(可通过构造函数覆盖)static config = {HEARTBEAT_INTERVAL: 30000, // 心跳间隔30sHEARTBEAT_TIMEOUT: 10000, // 心跳超时10sMAX_RECONNECT_ATTEMPTS: 5, // 最大重连次数BASE_RECONNECT_DELAY: 1000, // 基础重连延迟MAX_RECONNECT_DELAY: 30000, // 最大重连延迟30sMAX_PENDING_MESSAGES: 50 // 最大消息队列长度};// 运行时状态state = {ws: null,reconnectCount: 0, //重新连接计数isUserClosed: false, //用户自己关闭pendingMessages: [], //待发送的消息队列heartbeatTimer: null, //心跳计时器heartbeatTimeoutTimer: null //消息超时计时器};constructor(url, protocols, options = {}) {// 合并配置this.config = {...WebSocketClient.config,...options};this.url = url;this.protocols = protocols;this.connect();}/** 初始化连接 */connect() {this.dispose(); // 清理旧连接try {// 创建WebSocket实例this.state.ws = this.protocols ?new WebSocket(this.url, this.protocols) :new WebSocket(this.url);this.bindEventListeners();} catch (error) {console.error('WebSocket初始化失败:', error);this.handleReconnect();}}/** 清理旧连接和定时器 */dispose() {if (this.state.ws) {this.state.ws.close();this.state.ws = null;}this.clearHeartbeat();}/** 绑定事件监听器 */bindEventListeners() {const {ws} = this.state;ws.addEventListener('open', (event) => {console.log('连接已建立', event);/** 重置重连状态 */this.resetReconnect();//开始心跳this.startHeartbeat();/** 发送队列中的消息 */this.flushPendingMessages();});ws.addEventListener('error', (error) => {console.error('连接异常:', error);this.handleReconnect();});ws.addEventListener('close', (event) => {console.log('连接关闭:', event);this.handleClose(event);});ws.addEventListener('message', (event) => {this.handleIncomingMessage(event);});}/** 心跳管理 */startHeartbeat() {this.clearHeartbeat();this.state.heartbeatTimer = setInterval(() => {if (this.isConnected) {this.sendHeartbeat();this.monitorHeartbeatResponse();}}, this.config.HEARTBEAT_INTERVAL);}/** 发送心跳包 */sendHeartbeat() {this.send(JSON.stringify({type: 'ping',timestamp: Date.now()}));}/** 监测心跳响应 */monitorHeartbeatResponse() {this.state.heartbeatTimeoutTimer = setTimeout(() => {console.warn('心跳响应超时,执行断开');this.state.ws.close();}, this.config.HEARTBEAT_TIMEOUT);}/** 处理接收消息 */handleIncomingMessage(event) {try {const data = JSON.parse(event.data);if (data.type === 'ping') {//关闭超时计时器clearTimeout(this.state.heartbeatTimeoutTimer);return;}this.onMessage?.(data);} catch (error) {console.error('消息解析失败:', error);this.onError?.(error);}}/** 重连控制 */handleReconnect() {if (this.shouldReconnect) {const delay = this.calculateReconnectDelay();console.log(`将在 ${delay}ms 后重试...`);setTimeout(() => {this.state.reconnectCount++;this.connect();}, delay);}}/** 智能重连延迟计算 */calculateReconnectDelay() {return Math.min(this.config.BASE_RECONNECT_DELAY * (2 ** this.state.reconnectCount),this.config.MAX_RECONNECT_DELAY);}/** 发送消息(带队列控制) */send(data) {if (this.isConnected) {this.state.ws.send(data);} else {if (this.state.pendingMessages.length >= this.config.MAX_PENDING_MESSAGES) {console.warn('消息队列已满,丢弃最旧消息');this.state.pendingMessages.shift();}this.state.pendingMessages.push(data);}}/** 清空心跳定时器 */clearHeartbeat() {clearInterval(this.state.heartbeatTimer);clearTimeout(this.state.heartbeatTimeoutTimer);this.state.heartbeatTimer = null;this.state.heartbeatTimeoutTimer = null;}/** 重置重连状态 */resetReconnect() {this.state.reconnectCount = 0;this.state.isUserClosed = false;}/** 处理连接关闭事件 */handleClose(event) {this.clearHeartbeat();if (!this.state.isUserClosed) {this.handleReconnect();}}/** 发送队列中的消息 */flushPendingMessages() {while (this.state.pendingMessages.length > 0 && this.isConnected) {this.state.ws.send(this.state.pendingMessages.shift());}}// 公开方法//关闭close() {this.state.isUserClosed = true;this.dispose();}//重链接reconnect() {this.close();this.state.isUserClosed = false;this.connect();}// 状态判断//判断socket是开启状态吗get isConnected() {return this.state.ws?.readyState === WebSocket.OPEN;}//判断可以重连吗get shouldReconnect() {return !this.state.isUserClosed &&this.state.reconnectCount < this.config.MAX_RECONNECT_ATTEMPTS;}
    }// 使用示例
    // const ws = new WebSocketClient('wss://echo.websocket.org');
    // ws.onMessage = (data) => console.log('收到消息:', data);
    // ws.send('Hello World');

    使用示例

    // 初始化客户端
    const client = new WebSocketClient('wss://api.example.com/ws');// 监听消息
    client.onMessage = (data) => {console.log('收到消息:', data);
    };// 发送消息
    document.getElementById('sendBtn').addEventListener('click', () => {client.send(JSON.stringify({ type: 'chat', content: 'Hello World' }));
    });// 异常处理
    client.onError = (error) => {console.error('连接异常:', error);
    };


    文章转载自:

    http://9WDPV59e.sqhcf.cn
    http://tK28VFVF.sqhcf.cn
    http://cUrjQjuo.sqhcf.cn
    http://E4yS82J3.sqhcf.cn
    http://xVfINJNK.sqhcf.cn
    http://zm6kVxQj.sqhcf.cn
    http://6n6id555.sqhcf.cn
    http://v0lhAZ49.sqhcf.cn
    http://uEciomt4.sqhcf.cn
    http://GKhqr67h.sqhcf.cn
    http://Aw9vQIuI.sqhcf.cn
    http://LfSaX8Yy.sqhcf.cn
    http://qGrHg8K8.sqhcf.cn
    http://25VdN4ZC.sqhcf.cn
    http://voSZg6BN.sqhcf.cn
    http://4UxN0c7w.sqhcf.cn
    http://ZpObql86.sqhcf.cn
    http://dfa7PwDT.sqhcf.cn
    http://opisKPcT.sqhcf.cn
    http://Au1yZrGn.sqhcf.cn
    http://NoOO25yN.sqhcf.cn
    http://ma0cxFF6.sqhcf.cn
    http://IEfozoYF.sqhcf.cn
    http://3HhdPQaI.sqhcf.cn
    http://rWPYyVx8.sqhcf.cn
    http://vxWXu591.sqhcf.cn
    http://5Akudweh.sqhcf.cn
    http://byLBMV9w.sqhcf.cn
    http://fJOUMGX9.sqhcf.cn
    http://jUFJROKk.sqhcf.cn
    http://www.dtcms.com/wzjs/660977.html

    相关文章:

  13. 太原网站建设培训班ceo是什么职位
  14. 奥运网站模板html中文美食网站模板
  15. 网站建设及管理制度wordpress默认主题加logo
  16. 提供企业网站建设定制互动平台有效学时是什么意思
  17. 天水市建设局企业注册网站徐州网站建设薇at57666y
  18. 邯郸网站建设提供商世界500强
  19. 做seo需要会网站开发吗做展柜在哪些网站找客户
  20. html5手机网站建设深圳网站优化运营
  21. 有免费做海报的网站吗四川手机网站建设公司
  22. 做网站推广有作用没酒店网站建设方案策划书
  23. 做的差的网站招聘网站建设保定
  24. 社交网站 cms服装页面设计的网站
  25. 重庆官方网站有哪些三亚谁做网站
  26. 做米业的企业网站延安市网站建设
  27. 哪里有做旅游包车的网站seo经验是什么
  28. 组织建设 湖南省直工会网站网站开发技术及开发环境
  29. 免费店铺logo在线制作关键词优化按天计费
  30. 怎么知道自己的网站被k专门做优惠券的网站
  31. 直播间网站开发设计唐山哪里有建设网站
  32. 做电子商务网站需要学什么丰台新乡网站建设
  33. 哈尔滨网站建设推荐在家做私房菜的网站
  34. 网站开发教程视频北京网站备案流程
  35. 商业网站的建设流程本地环境wordpress修改php.ini
  36. 网站安全的必要性东莞营销型网站建设流程
  37. 债权债务交易网站开发如何利用php开源系统建立php网站
  38. 免费办公模板网站有哪些深圳网站建设代理
  39. 青岛做视频的网站设计大连建设工程设计院有限公司网站
  40. 农家乐怎么做网站网站怎么做转发
  41. php网站建设网站池州市网站建设
  42. 关于网站建设调查问卷网站建设教学课件