使用gorilla/websocket库实现Golang WebSocket通信:1. 安装库并创建HTTP处理器升级连接;2. 服务端通过Upgrader升级HTTP请求,收发消息;3. 前端或Go客户端连接服务端并交互;4. 用map和互斥锁管理多个连接,实现广播。
在Golang中实现WebSocket实时通信,关键在于使用成熟的库(如gorilla/websocket)建立连接,并处理客户端与服务端之间的双向数据传输。整个过程包括升级HTTP连接、维护连接状态和收发消息。
Go语言标准库不包含原生WebSocket支持,推荐使用社区广泛使用的gorilla/websocket:
创建一个HTTP处理器,将客户端的HTTP请求升级为WebSocket连接:
示例代码:
定义一个处理函数用于升级连接并读取消息:
import (
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool { return true }, // 允许跨域
}
func echoHandler(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 {
msgType, msg, err := conn.ReadMessage()
if err != nil {
log.Printf("读取消息失败: %v", err)
break
}
log.Printf("收到: %s", msg)
// 回显消息
conn.WriteMessage(msgType, msg)
}
}
func main() {
http.HandleFunc("/ws", echoHandler)
log.Println("服务启动于 :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
前端可用JavaScript原生WebSocket API连接Go服务端:
const ws = new WebSocket("ws://localhost:8080/ws");ws.onopen = () => {
console.log("已连接");
ws.send("Hello, Golang!");
};
ws.onmessage = (event) => {
console.log("收到:", event.data);
};
ws.onclose = () => {
console.log("连接关闭");
};
你也可以用Go编写客户端进行测试:
conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil)conn.WriteMessage(websocket.TextMessage, []byte("来自Go客户端"))
, msg, := conn.ReadMessage()
fmt.Printf("响应: %s", msg)
实际应用中常需向多个客户端广播消息。可通过维护连接池实现:
使用map和互斥锁保存所有活跃连接:
var clients = make(map[*websocket.Conn]bool)// 在echoHandler中注册连接
mutex.Lock()
clients[conn] = true
mutex.Unlock()
// 单独goroutine广播消息
for {
msg :=
mutex.Lock()
for client := range clients {
err := client.WriteMessage(websocket.TextMessage, msg)
if err != nil {
client.Close()
delete(clients, client)
}
}
mutex.Unlock()
}
当某个客户端断开时,在读循环中删除其连接记录即可。
基本上就这些。搭建一个基础的Golang WebSocket服务并不复杂,关键是理解连接升级机制和并发处理模式。生产环境还需加入心跳检测、认证授权和错误重连等机制。
# javascript
# java
# 前端
# git
# go
# github
# golang
# 处理器
# go语言
# websocket
相关文章:
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
建站之星代理如何获取技术支持?
如何在橙子建站上传落地页?操作指南详解
成都响应式网站开发,dw怎么把手机适应页面变成网页?
英语简历制作免费网站推荐,如何将简历翻译成英文?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
如何在阿里云高效完成企业建站全流程?
如何在Golang中引入测试模块_Golang测试包导入与使用实践
如何选择高效响应式自助建站源码系统?
python的本地网站制作,如何创建本地站点?
如何正确选择百度移动适配建站域名?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
导航网站建站方案与优化指南:一站式高效搭建技巧解析
,在苏州找工作,上哪个网站比较好?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
建站之星安装后如何自定义网站颜色与字体?
Android滚轮选择时间控件使用详解
网站制作公司排行榜,四大门户网站排名?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
建站之星伪静态规则如何正确配置?
css网站制作参考文献有哪些,易聊怎么注册?
建站之星导航配置指南:自助建站与SEO优化全解析
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
如何快速上传建站程序避免常见错误?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
如何用西部建站助手快速创建专业网站?
如何用5美元大硬盘VPS安全高效搭建个人网站?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
建站主机如何安装配置?新手必看操作指南
长沙做网站要多少钱,长沙国安网络怎么样?
制作网站怎么制作,*游戏网站怎么搭建?
怎么将XML数据可视化 D3.js加载XML
名字制作网站免费,所有小说网站的名字?
如何确保FTP站点访问权限与数据传输安全?
制作网站的模板软件,网站怎么建设?
长沙企业网站制作哪家好,长沙水业集团官方网站?
网站制作软件有哪些,制图软件有哪些?
定制建站方案优化指南:企业官网开发与建站费用解析
如何获取上海专业网站定制建站电话?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
建站主机CVM配置优化、SEO策略与性能提升指南
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
如何配置IIS站点权限与局域网访问?
北京网站制作的公司有哪些,北京白云观官方网站?
建站之星收费标准详解:套餐费用及年费价格表一览
高端网站建设与定制开发一站式解决方案 中企动力
一键网站制作软件,义乌购一件代发流程?
为什么Go需要go mod文件_Go go mod文件作用说明
微信小程序 五星评分(包括半颗星评分)实例代码
*请认真填写需求信息,我们会在24小时内与您取得联系。