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

WebSocket 设计思路

WebSocket 设计思路

1. 核心结构体

1.1 Manager (管理器)

// Manager 负责管理所有WebSocket连接
type Manager struct {clients   sync.Map    // 存储所有客户端连接broadcast chan []byte // 广播消息通道messages  chan Message // 消息处理通道config    *config.WebSocketConfig // 配置信息
}// 设计思路:
// 1. 使用 sync.Map 存储客户端,保证并发安全
// 2. 使用 channel 进行消息广播,避免并发问题
// 3. 独立的消息处理通道,方便业务层处理消息
// 4. 配置信息可从外部注入,提高灵活性

1.2 Client (客户端)

// Client 表示一个WebSocket客户端连接
type Client struct {conn    *websocket.Conn // WebSocket连接manager *Manager        // 所属的管理器send    chan []byte     // 发送消息的通道
}// 设计思路:
// 1. 每个客户端维护自己的WebSocket连接
// 2. 持有manager引用,方便访问全局功能
// 3. 独立的发送通道,实现异步消息发送

1.3 Message (消息)

// Message 定义消息结构
type Message struct {Type     string      `json:"type"`    // 消息类型Data     interface{} `json:"data"`    // 消息内容ClientID string      `json:"-"`       // 发送者ID
}// 设计思路:
// 1. 类型字段用于区分不同消息
// 2. 数据字段使用interface{}支持任意类型
// 3. ClientID方便追踪消息来源

2. 核心方法

2.1 连接管理

// 创建管理器
func NewManager(config *config.WebSocketConfig) *Manager {// 初始化管理器实例
}// 处理新的WebSocket连接
func (m *Manager) HandleWebSocket() gin.HandlerFunc {// 1. 验证连接请求// 2. 升级HTTP连接为WebSocket// 3. 创建新的客户端// 4. 启动读写协程
}// 设计思路:
// 1. 工厂方法创建管理器
// 2. 使用中间件处理连接
// 3. 自动管理连接生命周期

2.2 消息收发

// 读取消息
func (c *Client) readPump() {// 1. 设置读取超时// 2. 处理心跳响应// 3. 读取消息并处理// 4. 错误处理和清理
}// 发送消息
func (c *Client) writePump() {// 1. 处理发送队列// 2. 发送心跳// 3. 错误处理
}// 设计思路:
// 1. 独立的读写协程
// 2. 心跳保活机制
// 3. 优雅的错误处理

2.3 消息广播

// 广播消息
func (m *Manager) Broadcast(message []byte) {// 向所有客户端发送消息
}// 发送到指定客户端
func (m *Manager) SendToClient(clientAddr string, message []byte) bool {// 发送消息给特定客户端
}// 设计思路:
// 1. 支持全局广播
// 2. 支持定向发送
// 3. 处理发送失败情况

2.4 消息处理

// 发送结构化消息
func (m *Manager) SendMessage(messageType string, data interface{}) error {// 1. 构造消息结构// 2. 序列化消息// 3. 发送消息
}// 获取消息通道
func (m *Manager) GetMessages() <-chan Message {// 返回只读消息通道
}// 设计思路:
// 1. 统一的消息格式
// 2. 类型安全的发送方法
// 3. 方便的消息订阅机制

3. 工作流程

3.1 连接建立流程

  1. 客户端发起WebSocket连接请求
  2. 服务端验证请求并升级连接
  3. 创建Client实例并存储
  4. 启动读写协程

3.2 消息处理流程

  1. 客户端发送消息
  2. readPump接收并解析消息
  3. 消息发送到处理通道
  4. 业务层处理消息
  5. 需要时广播或回复

3.3 连接断开流程

  1. 检测到连接断开
  2. 清理客户端资源
  3. 从管理器中移除
  4. 关闭相关通道

4. 设计特点

4.1 并发安全

  • 使用sync.Map存储连接
  • 通过channel通信
  • 避免资源竞争

4.2 可扩展性

  • 模块化的设计
  • 接口定义清晰
  • 易于添加新功能

4.3 健壮性

  • 完善的错误处理
  • 心跳保活机制
  • 资源自动清理

4.4 易用性

  • 简单的API设计
  • 统一的消息格式
  • 丰富的使用示例

相关文章:

WebSocket 设计思路

WebSocket 设计思路 1. 核心结构体 1.1 Manager (管理器) // Manager 负责管理所有WebSocket连接 type Manager struct {clients sync.Map // 存储所有客户端连接broadcast chan []byte // 广播消息通道messages chan Message // 消息处理通道config *config.WebSo…...

Jenkins持续集成与交付安装配置

Jenkins 是一款开源的持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;工具&#xff0c;它主要用于自动化软件的构建、测试和部署流程。为项目持续集成与交付功能强大的应用。下面我们来介绍下它的安装与配置。 环境准备 更新系统组件&#xff08;这…...

ESP32作为Wi-Fi AP模式的测试

一、AP模式的流程 初始化阶段 (Init Phase): 1.1: Main task&#xff08;主任务&#xff09;初始化LwIP&#xff08;轻量级TCP/IP协议栈&#xff09;。 ESP_ERROR_CHECK(esp_netif_init()); 1.2: 创建和初始化Event task&#xff08;事件任务&#xff09;。 ESP_ERROR_CHECK…...

【爬虫】单个网站链接爬取文献数据:标题、摘要、作者等信息

源码链接&#xff1a; https://github.com/Niceeggplant/Single—Site-Crawler.git 一、项目概述 从指定网页中提取文章关键信息的工具。通过输入文章的 URL&#xff0c;程序将自动抓取网页内容 二、技术选型与原理 requests 库&#xff1a;这是 Python 中用于发送 HTTP 请求…...

Android RIL(Radio Interface Layer)全面概述和知识要点(3万字长文)

在Android面试时,懂得越多越深android framework的知识,越为自己加分。 目录 第一章:RIL 概述 1.1 RIL 的定义与作用 1.2 RIL 的发展历程 1.3 RIL 与 Android 系统的关系 第二章:RIL 的架构与工作原理 2.1 RIL 的架构组成 2.2 RIL 的工作原理 2.3 RIL 的接口与协议…...

leetcode_2816. 翻倍以链表形式表示的数字

2816. 翻倍以链表形式表示的数字 - 力扣&#xff08;LeetCode&#xff09; 搜先看到这个题目 链表的节点那么多 已经远超longlong能够表示的范围 那么暴力解题 肯定是不可以的了 我们可以想到 乘法运算中 就是从低位到高位进行计算 刚开始 我想先反转链表 然后在计算 然后在进…...

【论文阅读】MAMBA系列学习

Mamba code&#xff1a;state-spaces/mamba: Mamba SSM architecture paper&#xff1a;https://arxiv.org/abs/2312.00752 背景 研究问题&#xff1a;如何在保持线性时间复杂度的同时&#xff0c;提升序列建模的性能&#xff0c;特别是在处理长序列和密集数据&#xff08;如…...

MySQL教程之:批量使用mysql

在前几节中&#xff0c;您以交互方式使用mysql输入语句并查看结果。您也可以运行mysql批量模式。为此&#xff0c;请将要运行的语句放在文件中&#xff0c;然后告诉mysql从文件中读取其输入&#xff1a; $> mysql < batch-file 如果您在Windows下运行mysql&#xff0c;…...

17_Redis管道技术

Redis管道(Pipeline)技术是一种在 Redis 客户端与服务器之间进行高效数据交互的技术。 1.Redis管道技术介绍 1.1 传统请求响应模式 在传统的请求-响应模式下,客户端每发送一个命令后会等待服务器返回结果,然后再发送下一个命令。这种方式在网络延迟较高的情况下会导致性…...

【LC】3270. 求出数字答案

题目描述&#xff1a; 给你三个 正 整数 num1 &#xff0c;num2 和 num3 。 数字 num1 &#xff0c;num2 和 num3 的数字答案 key 是一个四位数&#xff0c;定义如下&#xff1a; 一开始&#xff0c;如果有数字 少于 四位数&#xff0c;给它补 前导 0 。答案 key 的第 i 个数…...

【redis】ubuntu18安装redis7

在Ubuntu 18下安装Redis7可以通过以下两种方法实现&#xff1a;手动编译安装和使用APT进行安装。 Ubuntu 18系统的环境和版本&#xff1a; $ cat /proc/version Linux version 4.15.0-213-generic (builddlcy02-amd64-079) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)…...

d2j-dex2jar classes.dex 执行报错:not support version 问题解决

这个错误是由于 dex2jar 工具不支持你的 classes.dex 文件的版本导致的。通常情况下&#xff0c;这是因为你尝试使用的 dex2jar 版本不支持 Android 较新的 DEX 文件格式&#xff08;例如 DEX 格式 038 或更新版本&#xff09;。 解决方法 以下是一些解决此问题的步骤&#x…...

智慧城市应急指挥中心系统平台建设方案

建设背景与目标 智慧城市应急指挥中心系统平台的建设&#xff0c;源于对城市管理精细化、智能化的迫切需求。平台旨在通过整合各方资源&#xff0c;实现应急事件的快速响应与高效处置&#xff0c;提升城市安全管理水平。 前端设计与信息采集 前端设计注重立体化、全方位信息…...

QT鼠标、键盘事件

一、鼠标 鼠标点击 mousePressEvent 鼠标释放 mouseReleaseEvent 鼠标移动 mouseMoveEvent 鼠标双击 mouseDoubleClickEvent 鼠标滚轮 QWheelEvent 二、键盘 键盘按下 keyPressEvent 键盘松开keyReleaseEvent 一、鼠标 #include <QMouseEvent> 鼠标点击 mouse…...

Ceph分布式存储集群,不仅仅是一个简单的对象存储解决方案

Ceph 作为 OpenStack 的存储后端 块存储&#xff08;Cinder 后端&#xff09; Ceph 的 RBD&#xff08;RADOS Block Device&#xff09;模块作为 OpenStack Cinder 服务的后端&#xff0c;为虚拟机提供块级别的存储资源。RBD 支持快照、克隆和恢复等功能&#xff0c;能够满足虚…...

DSP+Simulink——点亮LED灯(TMSDSP28379D)超详细

实现功能&#xff1a;DSP28379D-LED灯闪烁 :matlab为2019a :环境建立见之前文章 Matlab2019a安装C2000 Processors超详细过程 matlab官网链接&#xff1a; Getting Started with Embedded Coder Support Package for Texas Instruments C2000 Processors Overview of Creat…...

Linux 环境下编译安装 OpenCV 4.8.x

在 Linux 环境下编译安装 OpenCV 4.8.x 需要安装一系列依赖库。以下是详细的步骤说明&#xff0c;并附上每个依赖库的作用解释。 1. 环境准备 操作系统 推荐使用 Ubuntu 20.04/22.04 或其他基于 Debian 的 Linux 发行版。 编译器 GCC 9 或更高版本&#xff08;默认已安装&a…...

phpenc加密程序源码

免费扩展加密程序&#xff0c;类似于sg11加密&#xff0c;支持单个PHP&#xff08;免费&#xff09;文件以及批量PHP文件&#xff08;ZIP压缩包格式&#xff09;源码加密的保护平台&#xff0c;加密后的源码文件保持原有代码结构&#xff0c;可以跨平台运行&#xff0c;可以运行…...

学英语学Elasticsearch:04 Elastic integrations 工具箱实现对第三方数据源的采集、存储、可视化,开箱即用

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#xff1a; 先看关键单词&#xff0c;再看英文&#xff0c;最后看中文总结&#xff0c;再回头看一遍英文原文&#xff0c;效果更佳&#xff01;&#xff01; 关键词 ingestion 摄取 /ɪnˈdʒɛstʃən/ observability 可观察性 …...

2024.10.12 校招 实习 内推 面经

&#x1f6f0;️ &#xff1a;neituijunsir 交* 流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 中车电动2025届校园招聘正式启动 校招 | 中车电动2025届校园招聘正式启动 2、校招 | 莱斯信息2025届校园招聘 校招 | 莱斯信息2025届校园招聘 3、招聘 | 中电熊猫2025…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...