新闻中心

Golang如何处理WebSocket客户端与服务器_Golang WebSocket通信实践

2025-11-24
浏览次数:
返回列表
答案:本文介绍如何使用Golang和gorilla/websocket库实现WebSocket通信。首先通过Upgrader将HTTP连接升级为WebSocket,服务器监听/ws路径处理连接,读取并回显消息;客户端使用Dial连接服务器,启用Goroutine接收消息,主线程发送用户输入。实际应用中可用map和sync.Mutex管理多个连接,结合broadcast channel实现消息广播,充分发挥Go的高并发优势,适用于实时通信场景。

golang如何处理websocket客户端与服务器_golang websocket通信实践

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,广泛用于实时应用如聊天系统、实时通知和在线协作工具。Golang 因其高并发和轻量级 Goroutine 的特性,非常适合构建高性能的 WebSocket 服务。本文将介绍如何使用 Golang 实现 WebSocket 客户端与服务器之间的通信,并提供实用代码示例。

使用 gorilla/websocket 包

Go 标准库不直接支持 WebSocket,但社区最常用的第三方库是 gorilla/websocket。它提供了简洁的 API 来处理 WebSocket 连接、消息读写和连接管理。

安装方式:

go get github.com/gorilla/websocket

实现 WebSocket 服务器

一个典型的 WebSocket 服务器需要监听 HTTP 升级请求,将连接从 HTTP 切换到 WebSocket 协议。

以下是一个简单的 WebSocket 服务器示例:

package main import ( "log" "net/http" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, CheckOrigin: func(r *http.Request) bool { return true // 允许跨域(生产环境应限制) }, } func handleWebSocket(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Printf("升级失败: %v", err) return } defer conn.Close() for { // 读取消息 _, msg, err := conn.ReadMessage() if err != nil { log.Printf("读取失败: %v", err) break } log.Printf("收到消息: %s", msg) // 回显消息 if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil { log.Printf("发送失败: %v", err) break } } } func main() { http.HandleFunc("/ws", handleWebSocket) log.Println("服务器启动在 :8080") log.Fatal(http.ListenAndServe(":8080", nil)) }

说明:

  • upgrader.Upgrade 将 HTTP 请求升级为 WebSocket 连接。
  • CheckOrigin 设为 true 可接受任意来源的请求,适合开发调试。
  • 使用无限循环 for {} 持续读取客户端消息并回显。

实现 WebSocket 客户端

Go 也可以作为 WebSocket 客户端连接到服务器,适用于测试或集成其他服务。

美图云修 美图云修

商业级AI影像处理工具

美图云修 50 查看详情 美图云修

示例客户端代码:

package main import ( "bufio" "fmt" "log" "os" "strings" "github.com/gorilla/websocket" ) func main() { conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil) if err != nil { log.Fatalf("连接失败: %v", err) } defer conn.Close() // 开启一个 Goroutine 接收服务器消息 go func() { for { _, msg, err := conn.ReadMessage() if err != nil { log.Printf("接收消息失败: %v", err) return } fmt.Printf("服务器: %s\n", msg) } }() // 主线程读取用户输入 scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { text := scanner.Text() if strings.ToLower(text) == "exit" { break } err := conn.WriteMessage(websocket.TextMessage, []byte(text)) if err != nil { log.Printf("发送消息失败: %v", err) return } } }

说明:

  • 使用 websocket.Dial 连接到服务器。
  • 开启独立 Goroutine 处理接收逻辑,避免阻塞输入。
  • 通过标准输入读取用户消息并发送。

连接管理与并发处理

在实际项目中,可能需要管理多个客户端连接,比如广播消息或维护会话状态。

常见做法是使用一个全局的 map[*websocket.Conn]bool 存储连接,并配合互斥锁保护。

例如:

var ( clients = make(map[*websocket.Conn]bool) broadcast = make(chan []byte) mu sync.Mutex )

当新连接建立时加入 map,断开时删除。通过 broadcast channel 将消息推送给所有客户端。

基本上就这些。使用 gorilla/websocket 能快速搭建稳定可靠的 WebSocket 服务,结合 Go 的并发模型可轻松应对高并发场景。

以上就是Golang如何处理WebSocket客户端与服务器_Golang WebSocket通信实践的详细内容,更多请关注其它相关文章!


# 适用于  # 网站优化三大建议是  # 公司策划书营销推广  # 服装网站推广排名前十名  # 档案网站建设思路  # 番禺外贸推广营销公司  # 本溪品牌网站建设报价  # 如何查视频的关键词排名  # 湖北网站推广服务  # 怎么推广网站到国外  # 网站建设电  # 内网  # 何为  # 升级为  # 连接到  # git  # 多个  # 如何处理  # 如何使用  # 美图  # 客户端  # 标准库  # 跨域  # ai  # 工具  # websocket  # golang  # github  # go 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 蛙漫移动版在线看 蛙漫手机浏览器直达入口  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  《主播少女的秘密账号迷宫》首支宣传片  在Typer应用中优雅地处理和重组任意命令行参数  谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  随机参数递归函数的基准调用次数与时间复杂度探究  Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】  微信聊天记录怎么加密_微信聊天记录加密方法  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  双系统安装时,如何设置默认启动系统? msconfig命令了解一下!  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算  J*aScript动态修改指定div内所有a标签样式指南  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  邮政快递单号查询入口 邮政快递物流信息在线查询入口  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画  J*a TimerTask中HashMap意外清空的深层原因与解决方案  Python字典中优雅地迭代剩余元素的方法  微博网页版官方账号登录 微博网页版内容浏览使用指南  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具  多闪网页版在线观看免费入口_多闪官网访问入口  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法  Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  快手官方唯一登录入口 谨防山寨钓鱼网站  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏  优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率  支付宝如何设置安全保护_支付宝安全设置的全面教程  深入理解J*a合成构造器:何时以及为何阻止其生成  TikTok网页版直接登录 TikTok网页端官方平台入口  从J*aScript对象中精确提取指定属性的教程  探索高级语言到原生C/C++的转译:挑战与内存管理策略  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址  微信网页版官方入口直达 微信网页版网页版登录使用方法  Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性  实现全屏滚动与导航点:专业教程  sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE  Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性  百度网盘网页版入口 百度网盘网页版官方登录网址  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  汽车之家官方网站官网入口_汽车之家网页版直接进入 

搜索