Go-WebSocket实时通信从聊天室到消息推送系统实战
Go-WebSocket实时通信从聊天室到消息推送系统实战文章导语WebSocket是实现实时双向通信的利器。在Go中goroutine-per-connection模型与WebSocket天然契合。本文基于gorilla/websocket库实现从基础聊天室到生产级消息推送系统。一、WebSocket基础服务importgithub.com/gorilla/websocketvarupgraderwebsocket.Upgrader{ReadBufferSize:1024,WriteBufferSize:1024,CheckOrigin:func(r*http.Request)bool{returntrue// 生产环境需要校验Origin},}funchandleWebSocket(w http.ResponseWriter,r*http.Request){conn,err:upgrader.Upgrade(w,r,nil)iferr!nil{log.Print(升级失败:,err)return}deferconn.Close()for{messageType,msg,err:conn.ReadMessage()iferr!nil{break}// Echo回复conn.WriteMessage(messageType,msg)}}二、聊天室Hub模式typeHubstruct{clientsmap[*Client]boolbroadcastchan[]byteregisterchan*Client unregisterchan*Client mu sync.RWMutex}func(h*Hub)Run(){for{select{caseclient:-h.register:h.mu.Lock()h.clients[client]trueh.mu.Unlock()caseclient:-h.unregister:h.mu.Lock()if_,ok:h.clients[client];ok{delete(h.clients,client)close(client.send)}h.mu.Unlock()casemessage:-h.broadcast:h.mu.RLock()forclient:rangeh.clients{select{caseclient.send-message:default:close(client.send)delete(h.clients,client)}}h.mu.RUnlock()}}}三、心跳保活func(c*Client)ReadPump(hub*Hub){deferfunc(){hub.unregister-c c.conn.Close()}()c.conn.SetReadDeadline(time.Now().Add(pongWait))c.conn.SetPongHandler(func(string)error{c.conn.SetReadDeadline(time.Now().Add(pongWait))returnnil})for{_,msg,err:c.conn.ReadMessage()iferr!nil{break}hub.broadcast-msg}}func(c*Client)WritePump(){ticker:time.NewTicker(pingPeriod)deferfunc(){ticker.Stop()c.conn.Close()}()for{select{casemsg,ok:-c.send:if!ok{return}c.conn.WriteMessage(websocket.TextMessage,msg)case-ticker.C:c.conn.WriteMessage(websocket.PingMessage,nil)}}}四、全文总结Hub模式管理所有连接实现广播推送Ping/Pong心跳保持长连接活跃读写分离通过两个goroutine实现全双工连接数限制通过channel信号量控制参考文献gorilla/websocket: https://github.com/gorilla/websocketWebSocket RFC 6455Go Blog - Advanced Go Concurrency Patterns

相关新闻

从以太网到工业协议:网络协议栈核心概念与实战解析

从以太网到工业协议:网络协议栈核心概念与实战解析

这次我们来看一个网络技术领域的核心主题:以太网、TCP/IP、Socket和工业以太网协议。对于开发者、嵌入式工程师或网络运维人员来说,这几个名词几乎天天见,但它们的层级关系、具体职责以及如何协同工作,很多人可能只有一个模糊的概…

2026/8/23 14:26:48 阅读更多 →
旋转机械故障数据集全指南:从零到可复现故障诊断实验的数据选型与实战路线

旋转机械故障数据集全指南:从零到可复现故障诊断实验的数据选型与实战路线

旋转机械故障数据集全指南:从零到可复现故障诊断实验的数据选型与实战路线 【免费下载链接】Rotating-machine-fault-data-set Open rotating mechanical fault datasets (开源旋转机械故障数据集整理) 项目地址: https://gitcode.com/gh_mirrors/ro/Rotating-mac…

2026/8/23 14:27:46 阅读更多 →
家庭网络DIY布线全攻略:从穿线到测速,手把手实现全屋千兆覆盖

家庭网络DIY布线全攻略:从穿线到测速,手把手实现全屋千兆覆盖

这次我们来看一个非常实用的家庭网络改造项目:自己动手给家里布线装网口。很多朋友在装修时可能没有预留足够的网口,或者开发商预留的网口位置不合理,导致Wi-Fi信号覆盖差,NAS、游戏主机等设备连接不便。找专业师傅上门&#xff0…

2026/8/22 12:21:54 阅读更多 →

最新新闻

泊松分布:从数学原理到运维、排队与风险预测的实战指南

泊松分布:从数学原理到运维、排队与风险预测的实战指南

1. 从“排队”到“泊松”:一个无处不在的分布如果你在便利店结账时,发现收银台前恰好没人,心里会不会暗喜一下?或者,你运营一个网站,突然发现某个小时内的访问请求异常地多,服务器差点扛不住。又…

2026/8/23 21:52:42 阅读更多 →
Ubuntu源码编译GCC全攻略:从依赖安装到性能调优

Ubuntu源码编译GCC全攻略:从依赖安装到性能调优

1. 项目概述:为什么要在Ubuntu上源码安装GCC? 在Linux世界里,GCC(GNU Compiler Collection)是基石一样的存在,它不仅是C、C等语言的编译器,更是整个开源生态的构建工具。对于绝大多数Ubuntu用户…

2026/8/23 21:52:42 阅读更多 →
Apache Paimon数据湖核心架构解析:流批一体存储与实时数仓实践

Apache Paimon数据湖核心架构解析:流批一体存储与实时数仓实践

1. 项目概述:为什么我们需要关注Paimon数据湖?最近几年,数据湖这个概念在数据工程师和架构师的圈子里热度一直不减。从早期的HDFS加一堆文件,到后来强调事务性的Delta Lake、Iceberg、Hudi,大家一直在探索如何让海量数…

2026/8/23 21:52:42 阅读更多 →
Windows下Nginx优雅启停:生产级BAT脚本设计与实战

Windows下Nginx优雅启停:生产级BAT脚本设计与实战

1. 为什么一个“优雅”的Nginx启动脚本值得花半小时重写?你有没有试过双击一个start_nginx.bat,结果窗口闪一下就消失,连错误都没看清?或者改完配置文件,得手动打开任务管理器杀掉nginx.exe进程,再重新双击…

2026/8/23 21:52:42 阅读更多 →
外企求职全攻略:优势、技巧与实战经验

外企求职全攻略:优势、技巧与实战经验

1. 外企求职的核心优势解析"四天工作制20天年假"这样的福利组合在当下职场环境中确实令人艳羡。作为一位在外企和国内企业都工作过的职场人,我深刻体会到外企在员工关怀方面的差异化优势。这种差异不仅体现在表面福利上,更植根于管理制度和企业…

2026/8/23 21:52:41 阅读更多 →
CTR校准:从原理到实践,解决推荐系统预估偏差的关键技术

CTR校准:从原理到实践,解决推荐系统预估偏差的关键技术

1. 项目概述:为什么CTR校准是推荐系统的“定盘星”?做推荐系统的朋友,对CTR(点击率)这个指标肯定不陌生。我们每天训练模型、上线AB实验,核心目标之一就是提升预估CTR的准确性。但不知道你有没有遇到过这种…

2026/8/23 21:51:41 阅读更多 →

日新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →