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

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内容动态启用/禁用按钮
汽车之家官方网站官网入口_汽车之家网页版直接进入


2025-11-24
浏览次数:次
返回列表