当前位置: 首页 > 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…...

ios越狱脚本巨魔商店安装教程

使用爱思助手安装 安装爱思助手&#xff1a;在电脑上安装 iTunes 和爱思助手&#xff0c;并使用 Apple ID 登录2。 IPA 签名&#xff1a;打开爱思助手&#xff0c;选择工具箱中的 IPA 签名。点击添加 IPA 文件&#xff0c;选择下载的 TrollInstallerX.ipa 文件。选择使用 Apple…...

浅谈容灾技术方案详解

一、什么是容灾&#xff1f; 容灾指的是&#xff0c;在异地搭建一套或多套和主生产系统一样的IT系统&#xff0c;用于应对在系统因发生意外&#xff08;自然灾害、人为灾害、设备系统故障等&#xff09;造成业务影响的情况&#xff0c;达到尽量让生产业务损失最小的目的。 二…...

时序数据库InfluxDB—介绍与性能测试

目录 一、简述 二、主要特点 三、基本概念 1、主要概念 2、保留策略 3、连续查询 4、存储引擎—TSM Tree 5、存储目录 四、基本操作 1、Java-API操作 五、项目中的应用 六、单节点的硬件配置 七、性能测试 1、测试环境 2、测试程序 3、写入测试 4、查询测试 一…...

Python的循环

Python的循环 Python的循环有两种&#xff0c;分别是for…in循环和while循环。 for…in 循环 假设我们要循环输出一个列表里的元素&#xff1a; names [张三,李四,王五] for name in names:print(name)执行这段代码后&#xff0c;会依次打印names的每一个元素&#xff1a;…...

【机器学习】聚类评价指标之福尔克斯–马洛斯指数(Fowlkes–Mallows Index, FMI)

福尔克斯–马洛斯指数&#xff08;Fowlkes–Mallows Index, FMI&#xff09;是一种用于评估聚类结果与实际标签之间一致性的指标。FMI 值可以用于衡量聚类的准确性&#xff0c;特别是在有真值标签的监督评估场景中。 计算公式 FMI 的计算基于以下公式&#xff1a; 其中&#…...

分享一次面试经历

今天不只是分享面经&#xff0c;还分享一下主人公的整个面试经历&#xff0c;看看你是否会有相同的思路或者不同的见解&#xff0c;可以在评论区讨论一下&#xff1a; 问在项目里做了什么技术贡献。实施过程中&#xff0c;遇到哪些困难&#xff0c;怎么去思考解决的&#xff0…...

网络攻击行为可视化分析系统【数据分析 + 可视化】

一、系统背景 随着信息技术的快速发展&#xff0c;网络已成为现代社会不可或缺的一部分。然而&#xff0c;与此同时&#xff0c;网络攻击手段也日益多样化和复杂化&#xff0c;给企业和个人的信息安全带来了极大的威胁。传统的网络攻击分析方法往往依赖于人工分析和处理大量的…...

Qt 智能指针

Qt 智能指针 文章目录 Qt 智能指针QScopedPointer1. 自动删除对象2. 转移所有权3. 管理私有数据 QSharedPointer关键特性注意事项 QWeakPointer注意事项 QPointer QScopedPointer QScopedPointer 是 Qt 提供的一个智能指针&#xff0c;主要用于简化资源管理&#xff0c;防止内…...

CODESYS MODBUS TCP通信(禾川Q1 PLC作为MODBUS TCP从站)

禾川Q1 PLC MODBUS TCP 通信(PLC作为MODBUS TCP通信主站) 禾川Q1 PLC MODBUS TCP通信(CODESYS平台完整配置+代码)-CSDN博客文章浏览阅读28次。MATLAB和S7-1200PLC水箱液位高度PID控制联合仿真(MODBUSTCP通信)_将matlab仿真导入plc-CSDN博客文章浏览阅读722次。本文详细介绍了如…...

10.STM32F407ZGT6-内部温度传感器

参考&#xff1a; 1.正点原子 前言&#xff1a; 本笔记的主要目的和意义就是&#xff0c;再次练习ADC的使用。 32.1 内部温度传感器简介 STM32F407 有一个内部的温度传感器&#xff0c;可以用来测量 CPU 及周围的温度(TA)。对于STM32F407 系列来说&#xff0c;该温度传感器在…...

wordpress图片cdn/江苏网站建设推广

查看Linux服务器的运行级别&#xff1a;who -r 或 runlevelLinux系统有7个运行级别(runlevel) 运行级别0&#xff1a;系统停机状态&#xff0c;系统默认运行级别不能设为0&#xff0c;否则不能正常启动运行级别1&#xff1a;单用户工作状态&#xff0c;root权限&#xff0c;用…...

东莞建设培训中心网站/手机端百度收录入口

i.MX6ULL终结者三大手册&#xff0c;加速学习和开发速度&#xff0c;一秒化无形! 《嵌入式Linux开发指南》《开发板使用手册》《裸机使用手册》 详细手册点击链接下载&#xff1a;https://pan.baidu.com/s/1Xat4C-cDa2Gi1UwNckNRTw 提取码&#xff1a;064r 前言 总领及学习指…...

wordpress做ftp/百度一下 官方网

文章目录 概论对比HashMap 的初始容量默认11 的初始容量任意指定非负的容量对比HashMap 的 对null 值的支持HashTable key value 都不支持null升级HashTable 使其支持null 做value对比 HashTable 的继承关系DictionaryHashtable线程安全contains方法debug 源码 put 方法总结你觉…...

中国建设银行沈阳铁西支行网站/个人网页制作完整教程

古人很伟大&#xff0c;说了一句符合统计学原理的话。 如果以95%作为置信度&#xff0c;人刚生下来时&#xff0c;应该是有95%的概率是一个好人&#xff0c;5%的概率是个坏蛋。如果人之初&#xff0c;性本恶的话&#xff0c;你走在马路上&#xff0c;遇到100个人&#xff0c;会…...

国企网站建设合同/深圳网站设计公司

文章目录一.原型链机制1. 原型链的本质2. 引用类型的构造函数3. 基本类型的包装类二. 对象与属性1. 对象直接打点验证某个属性是否存在4. instanceof 运算符三. 继承1. 原型链继承2. 构造函数继承3. 组合继承一.原型链机制 1. 原型链的本质 只要是对象&#xff0c;一定有原型…...

有域名有服务器如何做网站/环球军事新闻最新消息

本文原创首发于公众号&#xff1a;ReactNative开发圈 Realm是一款专为移动​端开发的高性能数据库。支持React-Naitve&#xff0c;支持 iOS 和 Android。官网文档地址&#xff1a;https://realm.io/docs/javascr...。前提 React Native的版本要大于等于0.31.0安装 npm install …...