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

第四章:WebSocket 通信机制全解与客户端发包实录

如果你以为一个游戏启动后只靠本地逻辑运转,那你真是低估了网络通信的存在感。在互动组件项目里,WebSocket 才是真正的灵魂通道——UI 再好看,没包发出去也等于白搭。

本章我们深入讲解 WebSocket 在安卓前端项目中的应用,从封装结构到消息分发,从心跳维持到断线重连,用实际的项目代码完整梳理一遍消息通信流程。

首先是通信初始化部分。项目的 Socket 一般集中封装在 NetManager 中。以下是一个典型实现:

const NetManager = {ws: null,isConnected: false,reconnectTimer: null,heartbeatTimer: null,connect(url) {if (this.ws && this.isConnected) return;this.ws = new WebSocket(url);this.ws.binaryType = "arraybuffer";this.ws.onopen = this._onOpen.bind(this);this.ws.onmessage = this._onMessage.bind(this);this.ws.onclose = this._onClose.bind(this);this.ws.onerror = this._onError.bind(this);},_onOpen() {console.log("连接服务器成功");this.isConnected = true;this._startHeartbeat();},_onClose() {console.warn("服务器连接断开");this.isConnected = false;this._reconnect();},_onError(err) {console.error("WebSocket 连接错误", err);},_onMessage(event) {let data = new Uint8Array(event.data);ProtocolManager.decodeMessage(data);},_reconnect() {clearTimeout(this.reconnectTimer);this.reconnectTimer = setTimeout(() => {this.connect("ws://your-server-address");}, 3000);},_startHeartbeat() {clearInterval(this.heartbeatTimer);this.heartbeatTimer = setInterval(() => {this.send(ProtocolManager.encodeHeartbeat());}, 5000);},send(data) {if (!this.isConnected) return;this.ws.send(data);}
};

这段代码具备连接管理、断线重连、心跳保活三大能力。只要初始化时调用 connect 即可自动绑定监听事件。

接下来是协议设计。客户端与服务器之间的通信是基于自定义协议的,通常结构如下:

[消息ID][消息体长度][消息体]

为了更规范,建议封装 ProtocolManager:

const ProtocolManager = {encodeMessage(msgId, payload) {let body = JSON.stringify(payload);let bodyBuffer = new TextEncoder().encode(body);let buffer = new Uint8Array(4 + bodyBuffer.length);buffer[0] = (msgId >> 8) & 0xFF;buffer[1] = msgId & 0xFF;buffer[2] = (bodyBuffer.length >> 8) & 0xFF;buffer[3] = bodyBuffer.length & 0xFF;buffer.set(bodyBuffer, 4);return buffer;},decodeMessage(buffer) {let msgId = (buffer[0] << 8) | buffer[1];let bodyLen = (buffer[2] << 8) | buffer[3];let json = new TextDecoder().decode(buffer.slice(4, 4 + bodyLen));let payload = JSON.parse(json);MessageDispatcher.dispatch(msgId, payload);},encodeHeartbeat() {return this.encodeMessage(0x0001, {});}
};

服务器返回后,前端需要有一个调度系统负责分发:

const MessageDispatcher = {listeners: {},register(msgId, callback, context) {this.listeners[msgId] = { callback, context };},dispatch(msgId, data) {if (!this.listeners[msgId]) {console.warn("未处理的消息:", msgId);return;}let { callback, context } = this.listeners[msgId];callback.call(context, data);}
};

示例注册方式如下:

MessageDispatcher.register(0x1001, this.onHallData, this);

断线重连与心跳机制是必不可少的,尤其在安卓端容易被系统后台挂起或回收,断线重连可以提升稳定性。心跳一般是定时每 5 秒发一个“空包”:

setInterval(() => {NetManager.send(ProtocolManager.encodeHeartbeat());
}, 5000);

如果连接断开,NetManager 会触发 reconnect,通过定时器进行重新连接尝试。

下面是一个完整的发包→收包→界面处理流程:

let payload = {userId: UserManager.userId
};
NetManager.send(ProtocolManager.encodeMessage(0x1003, payload));

服务器返回包结构如下:

{"nickname": "player001","avatar": "icon_12.png","level": 5,"gender": 1
}

接收方式如下:

MessageDispatcher.register(0x1004, function (data) {UIManager.showUI("UIUserInfo", (ui) => {ui.updateUserInfo(data);});
}, this);

到这里为止,客户端发包、收包、处理 UI 的整个流程已经完整建立。

总结一下:这一章我们完成了客户端通信模块的封装与调用实践,包括了 WebSocket 的初始化、协议设计、消息派发与重连策略。下一章将进入 Node.js 服务端,看看服务器是如何处理这些消息与房间广播的。

相关文章:

第四章:WebSocket 通信机制全解与客户端发包实录

如果你以为一个游戏启动后只靠本地逻辑运转&#xff0c;那你真是低估了网络通信的存在感。在互动组件项目里&#xff0c;WebSocket 才是真正的灵魂通道——UI 再好看&#xff0c;没包发出去也等于白搭。 本章我们深入讲解 WebSocket 在安卓前端项目中的应用&#xff0c;从封装结…...

pnpm项目内网迁移

pnpm项目内网迁移 文章目录 pnpm项目内网迁移0.前言1.基础环境安装2.构建pnpm离线安装包3.使用pnpm重新安装项目依赖4.项目迁移参考链接&#xff1a; 0.前言 要将一个依赖pnpm的项目迁移到内网离线环境下进行开发。 1.基础环境安装 要保证NodeJS版本一致&#xff0c;否则执行…...

C++23 放宽范围适配器以允许仅移动类型(P2494R2)

文章目录 引言背景与动机提案内容与实现细节提案 P2494R2实现细节编译器支持 对开发者的影响提高灵活性简化代码向后兼容性 示例代码总结 引言 C23 标准中引入了许多重要的改进&#xff0c;其中一项值得关注的特性是放宽范围适配器&#xff08;range adaptors&#xff09;以允…...

[ctfshow web入门] web119

信息收集 import requestsurl "http://51a7e437-2e66-4742-bbfe-e4cce44e360b.challenge.ctf.show/" for i in range(255):data {"code": f"{chr(i)}"}response requests.post(url, datadata)# print(len(response.text))# print(response.t…...

vector--OJ3

链接: [link](链接: link) class Solution { public: vector<string> str{ "","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };void CB(string& …...

第6章 实战案例:基于 STEVAL-IDB011V1 板级 CI/CD 全流程

在前五章中,我们完成了嵌入式 CI/CD 从环境搭建、编译自动化、测试自动化、发布分发到监控回归的全技术链条。本章将以 STEVAL-IDB011V1(搭载 BlueNRG-355)评估板为实战载体,手把手演示如何在 GitLab CI(或 Jenkins)上,构建一条从 Git Push → 编译 → 测试 → 刷写 → …...

逆变器的输出外特性分析

VSG 并网状态下&#xff0c;考虑到弱电网下线路阻抗不能忽略&#xff0c;VSG 的功率传输模型可以表示为 VSG 的输出电压经过线路阻抗后串联至电网&#xff08;考虑滤波电感&#xff0c;且忽略滤波电容作用&#xff09;。设 U 为 VSG 输出电压的幅值&#xff0c;Ug为电网电压的幅…...

如何给PSCAD添加库文件

1、点击Options 2、选择蓝色的选项 3、查看Intel(R) Visual Fortran Compiler XE 的版本 4、打开原文件的Library 5、打开 6、点击这个文件的右键 7、然后选择第一项project setting 9、先把第8步中link里面原有的路径删除&#xff0c;再点browes[A1] &#xff0c;然后选择 [A…...

基于simulink搭建的模块化多电平MMC仿真模型

1. 模块化多电平换流器的运行原理 1.1模块化多电平换流器的拓扑结构 MMC共由6个桥臂构成。其中每个桥臂由若干个串联且结构相同的子模块(Sub-Module, SM)与一个电抗器L串联…...

基于simulink的LCC-HVDC输电模型

1.本模型基于simulink搭建常规直流输电模型&#xff0c;运行稳定。 有需要交流或者模型的可在CSDN上留言...

PWM整流器双闭环PI参数的整定

1. 整流侧电路拓扑图 整流电路由交流侧电源、线路电阻、线路电抗、整流器、滤波电容以及负载组成。整体电路图如图1所示。 图 1 整流电路拓扑图 其中&#xff0c;IGBT的开关状函数如下式所示 根据图 1 列出 KVL 公式如下&#xff0c;电流的正方向是从左到右 对于每一相的IGBT相…...

柔性直流输电系统介绍及simulink模型的搭建

​​​​​​1. 柔性直流输电的运行原理 柔性直流输电系统由电压源型换流器与直流输电线路构成, 图 1‑1所示为单端电压源型换流器原理图。柔性直流输电系统的功率可以双向流动,即换流器既可以作为整流站将从交流系统接收的功率通过直流线路输送出去,也可以作为逆变站将通过直流…...

matlab求矩阵的逆、行列式、秩、转置

inv - 计算矩阵的逆 用途&#xff1a;计算一个可逆矩阵的逆矩阵。 D [1, 2; 3, 4]; % 定义一个2x2矩阵 D_inv inv(D); % 计算矩阵D的逆 disp(D_inv);det - 计算矩阵的行列式 用途&#xff1a;计算方阵的行列式。 E [1, 2; 3, 4]; determinant det(E); % 计算行列式 disp…...

如何在纷杂的环境当中保持保持独立思考能力?

引言 当你在人群当中时&#xff0c;你是否经常容易受到身边人的干扰&#xff0c;而丢失自己原有的想法&#xff0c;其实在环境纷杂当中&#xff0c;我们很容易产生“从众效应”而丢失了自己对这件事独立思考的能力。拥有不受外界影响&#xff0c;独立思考的能力可以让我们更加…...

Linux:计算机的层状结构

1.冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本、台式机。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系结构。 CPU&#xff1a;运算器和控制器组成。运算器主要工作是做算术运算和逻辑运算。控制器主要工作是协调设备之间信息流动的…...

注册表设置windows背景护眼色

方法一&#xff1a; CtrlR&#xff0c;输入regedit打开注册表 HKEY_CURRENT_USER\Control Panel\Colors 右侧窗口Windows键值由255 255 255改为202 234 206。 方法二&#xff1a; 还是注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\DefaultColo…...

《算法导论(第4版)》阅读笔记:p82-p82

《算法导论(第4版)》学习第 17 天&#xff0c;p82-p82 总结&#xff0c;总计 1 页。 一、技术总结 1. Matrix Matrices(矩阵) (1)教材 因为第 4 章涉及到矩阵&#xff0c;矩阵属于线性代数(linear algebra)范畴&#xff0c;如果不熟悉&#xff0c;可以看一下作者推荐的两本…...

政府数据开放试点企业如何抢占特许经营协议黄金席位

首席数据官高鹏律师团队 《中共中央办公厅 国务院办公厅关于 加快公共数据资源开发利用的意见》的落地&#xff0c;标志着数据从“封闭管理的行政资源”正式转变为“可流通的市场要素”。但机遇与风险从来是一枚硬币的两面——特许经营协议的黄金席位背后&#xff0c;隐藏着…...

Spring之Bean的初始化 Bean的生命周期 全站式解析

目录 导图 步骤 第一步 实例化 第二步 属性赋值 第三步 初始化 aware 接口 BeanPostProcessor 接口 InitializingBean 和 init-method 第四步使用 第五步使用后销毁 描述一下 Bean 的 生命周期 导图 步骤 总体上可以分为五步 首先是 Bean 的实例化Bean 在进行实例…...

exit耗时高

背景&#xff1a;程序退出发现被强制退出&#xff0c;而不是正常的退出。正常退出是发送15信号&#xff0c;而异常退出是发送信号9&#xff0c;强制退出。退出机制是先发送信号15&#xff0c;然后6s内没有退出完成&#xff0c;会发送信号9。通过查看退出流程&#xff0c;是将初…...

密文搜索-map容器+substr

https://www.luogu.com.cn/problem/P8630 ///因为密码是打乱顺序的&#xff0c;所以只要字母个数对上就行 ///用map存字母种类和个数 ///vector存每行密码 ///不用set&#xff0c;每行独立 再考察一个字符串分割函数substr&#xff0c;map自动比较 #include<bits/stdc.h…...

从专家编码到神经网络学习:DTM 的符号操作新范式

1st author: Paul Soulos paper: Differentiable Tree Operations Promote Compositional Generalization ICML 2023 code: psoulos/dtm: Differentiable Tree Machine 1. 问题与思路 现代深度学习在连续向量空间中取得了巨大成功&#xff0c;然而在处理具有显式结构&#x…...

江协科技GPIO输入输出hal库实现

首先先介绍一下GPIO在hal库里面的函数 GPIOhal库函数介绍 GPIO在hal库里面有两个文件&#xff0c;一个hal_gpio.h一个hal_gpio_ex.h 第一个文件主要存放的就是hal库里面对gpio的相关函数以及GPIO配置的结构体&#xff0c;还有hal库与标准库的一大区别回调函数。以及一些对gp…...

软件设计师教程—— 第二章 程序设计语言基础知识(上)

前言 在竞争激烈的就业市场中&#xff0c;证书是大学生求职的重要加分项。中级软件设计师证书专业性强、认可度高&#xff0c;是计算机相关专业学生考证的热门选择&#xff0c;既能检验专业知识&#xff0c;又有助于职业发展。本教程将聚焦核心重点&#xff0c;以点带面构建知…...

Java 快速转 C# 教程

以下是一个针对 Java 开发者快速转向 C# 的简明教程&#xff0c;重点对比 Java 与 C# 的异同&#xff0c;帮助你快速上手。 项目结构&#xff1a; .sln &#xff1a;解决方案文件&#xff0c;管理多个项目之间的依赖关系。.csproj &#xff1a;项目文件&#xff0c;定义目标框…...

Linux面试题集合(5)

把文件1的内容追加到文件2 cat 文件1>>文件2 把文件1和文件2合并成文件3 cat 文件1 文件2>文件3 使用less查看文件时&#xff0c;搜寻ab字符 /ab 用more和less如何查看文件 more&#xff1a; CtrlF -- 向下滚动一屏 CtrlB -- 返回上一屏 f -- 向下翻屏 b -- 向上翻屏 …...

OpenCV 光流估计:从原理到实战

在计算机视觉领域&#xff0c;光流估计&#xff08;Optical Flow Estimation&#xff09;是一项至关重要的技术&#xff0c;它能够通过分析视频序列中图像像素的运动信息&#xff0c;捕捉物体和相机的运动情况。OpenCV 作为强大的计算机视觉库&#xff0c;为我们提供了高效实现…...

星火杯大模型应用创新赛学习笔记——datawhale

背景——赛事任务 聚焦大学生真实应用场景&#xff0c;围绕阅读、写作、搜索、聊天、问答等方向&#xff0c;聚焦口语学习、面试招聘、论文写作、学习笔记等一个或多个细分应用场景&#xff0c;完成具有创新性、实用性的应用方案&#xff0c;呈现可演示、可落地、具备商业价值…...

Ulyssess Ring Attention

https://zhuanlan.zhihu.com/p/689067888https://zhuanlan.zhihu.com/p/689067888DeepSpeed Ulysess&#xff1a;切分Q、K、V序列维度&#xff0c;核心卖点保持通信复杂度低&#xff0c;和GPU数无关&#xff0c;和序列长度呈线性关系。 Ring-Attention&#xff1a;切分Q、K、V序…...

c++重要知识点汇总(不定期更新)

前言 真心希望各位dalao点赞收藏~ 树状数组 作用&#xff1a;高效求出区间前缀和&#xff0c;允许进行修改操作。 举个栗子&#xff1a; 刚开始有8项&#xff0c;分别为1-8。 首先构建二叉树&#xff1a; 1-8/ |/ |/ |/ |/ |1-4 5-8/ | / |/ | / |1-…...

重排序模型解读 mxbai-rerank-base-v2 强大的重排序模型

mxbai-rerank-base-v2 强大的重排序模型 模型介绍benchmark综合评价安装 模型介绍 mxbai-rerank-base-v2 是 Mixedbread 提供的一个强大的重排序模型&#xff0c;旨在提高搜索相关性。该模型支持多语言&#xff0c;特别是在英语和中文方面表现出色。它还支持代码和 SQL 排序&a…...

电子电路:到底该怎么理解电容器的“通交流阻直流”?

电容器“通交流&#xff0c;阻直流”的特性源于其对不同频率电信号的响应差异&#xff0c;具体可通过以下步骤理解&#xff1a; 一、电容器的基本结构与充放电机制 结构&#xff1a;由两个导体极板&#xff08;如金属&#xff09;和中间的绝缘介质组成。充放电过程&#xff1a…...

售前工作.工作流程和工具

第一部分 售前解决方案及技术建议书的制作 售前解决方案编写的标准操作步骤SOP: 售前解决方案写作方法_哔哩哔哩_bilibili 第二部分 投标过程关键活动--商务标技术方案 1. 按项目管理--售前销售项目立项 销售活动和销售线索的跟踪流程和工具 1&#xff09;拿到标书&#xff…...

ORACLE数据库实例报错ORA-00470: LGWR process terminated with error宕机问题分析报告

服务概述 10月21号03:22分&#xff0c;BOSS数据库实例发生异常宕机&#xff1b;工程师及时响应此问题并对此故障原因进行分析及相关建议,详细的故障情况及相关日志、TRACE文件的分析及总结、建议&#xff0c;请参阅本文档。 hzboss数据库实例宕机分析 4.1 数据库层面日志的分…...

深度学习---知识蒸馏(Knowledge Distillation, KD)

一、知识蒸馏的本质与起源 定义&#xff1a; 知识蒸馏是一种模型压缩与迁移技术&#xff0c;通过将复杂高性能的教师模型&#xff08;Teacher Model&#xff09;所学的“知识”迁移到轻量级的学生模型&#xff08;Student Model&#xff09;&#xff0c;使学生模型在参数量和计…...

AI日报 - 2024年5月17日

&#x1f31f; 今日概览 (60秒速览) ▎&#x1f916; 大模型前沿 | OpenAI推出自主编码代理Codex&#xff1b;Google DeepMind发布Gemini驱动的编码代理AlphaEvolve&#xff0c;能设计先进算法&#xff1b;Meta旗舰AI模型Llama 4 Behemoth发布推迟。 Codex能并行处理多任务&…...

OAuth2.0

OAuth2.0 1. 什么是OAuth2.02.OAuth2.0的应用场景3. OAuth2.0基本概念4. 经典OAuth2.0认证流程5. 四种授权模式5.1 授权码模式&#xff08;Authorization Code Grant&#xff09;5.2 隐式授权&#xff08;Implicit Grant&#xff09;5.3 密码模式&#xff08;Resource Owner Pa…...

deepin v23.1 音量自动静音问题解决

有的机器上会有音量自动静音问题, 如果你的电脑上也遇到, 这个问题是 Linux 内核的原因, ubuntu上也可能会遇到相同问题(比如你升级了最新内核6.14), 而我测试得6.8.0的内核是不会自动静音的. Index of /mainline 到上面这个链接(linux 内核的官方链接)下载6.8.0的内核, s…...

Spring Security 集成指南:避免 CORS 跨域问题

Spring Security 集成指南&#xff1a;避免 CORS 跨域问题 在现代 Web 应用开发中&#xff0c;前后端分离架构已成为主流。当我们使用 Spring Security 保护后端 API 时&#xff0c;经常会遇到跨域资源共享&#xff08;CORS&#xff09;问题。这篇文章将详细解析 Spring Secur…...

stack和queue简单模拟实现

stackreverse_iteratorqueuepriority_queue仿函数具体代码 stack Stacks are a type of container adaptor, specifically designed to operate in a LIFO context (last-in first-out), where elements are inserted and extracted only from one end of the container. 上述描…...

2.单链表两数相加(java)

题目描述&#xff1a; 分析&#xff1a; 1.首先创建一个虚拟节点 ListNode dummy new ListNode(-1);再创建一个节点来保存虚拟节点&#xff0c;因为使用虚拟节点来移动&#xff0c;如果不保存&#xff0c;最后就会丢失。保存虚拟节点&#xff1a;ListNode pdummy; 2.进位标志…...

JDBC 的编写步骤及原理详解

一、JDBC 简介 JDBC&#xff08;Java DataBase Connectivity&#xff09;即 Java 数据库连接&#xff0c;是 Java 语言用于操作数据库的一套 API。它为多种关系数据库提供了统一的访问方式&#xff0c;允许 Java 程序与不同类型的数据库&#xff08;如 MySQL、Oracle、SQL Ser…...

AIStarter Windows 版本迎来重磅更新!模型插件工作流上线,支持 Ollama / ComfyUI 等多平台本地部署模型统一管理

如果你正在使用 AIStarter 工具进行本地 AI 模型部署 &#xff0c;那么这条消息对你来说非常重要&#xff01; 在最新推出的 AIStarter Windows 正式版更新中 &#xff0c;官方对整个平台进行了功能重构和性能优化&#xff0c;尤其是新增了「模型插件工作流 」功能&#xff0c…...

卸载和安装JDK

文章目录 卸载JDK安装JDK 卸载JDK 删除java的安装目录删除JAVA_HOME删除path下关于java的目录在cmd命令提示符中输入 java -version 安装JDK 浏览器搜索JDK8 下载电脑对应版本 双击安装JDK 记住安装的路径 配置环境变量 我的电脑 -> 右键 -> 属性 新建系统环境变量…...

【蓝桥杯省赛真题51】python石头运输 第十五届蓝桥杯青少组Python编程省赛真题解析

python石头运输 第十五届蓝桥杯青少年组python比赛省赛真题详细解析 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解 <...

USRP 射频信号 采集 回放 系统

USRP 射频信号采集回放系统 也可以叫做&#xff1a; 利用宽带RF录制和回放系统实现6G技术研究超宽带射频信号采集回放系统使用NI USRP平台实现射频信号录制和回放操作演示USRP也能实现多通道宽带信号流盘回放了&#xff01; 对于最简单的实现方法就是使用LabVIEW进行实现 采…...

产品经理入门(2)产品体验报告

产品体验报告大纲&#xff1a;重点在产品体验——优点。 1.产品概括 可以从各大平台搜产品介绍。 2.市场分析 按照产品方向分析各个指标——包括有效使用时间,市场规模等。 3. 用户分析——对用户通过各项指标画像。 4.产品体验——对各项功能与设计的体验。 5.报告总结...

区块链基本理解

文章目录 前言一、什么是分布式账本(DLT)二、什么是P2P网络?二、共识算法三、密码算法前言 区块链是由一个一个数据块组成的链条,按照时间顺序将数据块逐一链接,通过哈希指针链接,所有的数据块共同维护一份分布式账本(DLT),每个节点(可以理解为一个玩家,一台计算机)都拥…...

数字万用表与指针万用表使用方法及注意事项

在电子测量领域&#xff0c;万用表是极为常用的工具&#xff0c;数字万用表和指针万用表各具特点。熟练掌握它们的使用方法与注意事项&#xff0c;能确保测量的准确性与安全性。下面为您详细介绍&#xff1a; 一 、数字万用表按钮功能 > 进入及退出手动量程模式 每 按 […...

C语言查漏补缺

1、数组初始化时&#xff0c;例如char arr[5] "abcde"&#xff0c;因为字符串中有6个字符&#xff0c;即末尾还有个结束符&#xff0c;但是数组容量为5&#xff0c;所以仅接纳5个字符&#xff0c;末尾的结束符不会被接纳&#xff0c;故而这样的字符数组在直接输出时…...