使用Golang结合gorilla/websocket库可实现高效WebSocket服务,支持全双工通信,适用于实时聊天、通知等场景。1. 安装库:go get github.com/gorilla/websocket;2. 创建升级器Upgrader并处理HTTP升级;3. 实现消息读写循环,服务端回显客户端消息;4. 浏览器通过JavaScript创建WebSocket连接测试通信;5. 构建广播机制,使用clients映射维护连接池,broadcast通道分发消息;6. 启动独立goroutine处理广播,实现多人聊天室模型。该方案依托Go并发优势,具备高并发支持能力,适合生产环境实时通信需求。

使用Golang结合
gorilla/websocket
库可以轻松实现高效的WebSocket服务,支持客户端与服务器之间的全双工通信。相比传统的HTTP请求-响应模式,WebSocket允许服务端主动向客户端推送消息,非常适合实时聊天、通知系统、在线协作等场景。
安装gorilla/websocket
在项目中引入
gorilla/websocket
库:
go get github.com/gorilla/websocket
该库是Go语言中最流行的WebSocket实现之一,API简洁且稳定。
基础WebSocket服务端实现
创建一个简单的WebSocket处理器,用于升级HTTP连接并处理消息收发:
立即学习“go语言免费学习笔记(深入)”;
package main
import (“log””net/http””github.com/gorilla/websocket”)
var upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool {return true // 允许跨域连接,生产环境应限制来源},}
func wsHandler(w http.ResponseWriter, r *http.Request) {conn, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Print(“升级WebSocket失败:”, err)return}defer conn.Close()
for { // 读取客户端消息 messageType, message, err := conn.ReadMessage() if err != nil { log.Print("读取消息失败:", err) break } // 打印收到的消息 log.Printf("收到: %s", message) // 回显消息给客户端 if err := conn.WriteMessage(messageType, message); err != nil { log.Print("发送消息失败:", err) break }}
}
func main() {http.HandleFunc(“/ws”, wsHandler)log.Println(“服务器启动在 :8080”)log.Fatal(http.ListenAndServe(“:8080”, nil))}
上面代码中,
upgrader.Upgrade()
将HTTP协议升级为WebSocket连接。进入循环后,服务端持续读取客户端消息并回显。
客户端连接测试
使用浏览器JavaScript快速测试连接:
const ws = new WebSocket(“ws://localhost:8080/ws”);
ws.onopen = () => {console.log(“连接已建立”);ws.send(“你好,服务端!”);};
ws.onmessage = (event) => {console.log(“收到消息:”, event.data);};
ws.onclose = () => {console.log(“连接已关闭”);};
打开浏览器控制台运行以上代码,可以看到与Go服务端的双向通信正常工作。
实现广播机制(多人聊天室示例)
真实场景中通常需要将消息广播给多个连接。可以通过维护连接池实现:
var clients = make(map[*websocket.Conn]bool)var broadcast = make(chan []byte)
func wsHandler(w http.ResponseWriter, r *http.Request) {conn, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Print(“升级失败:”, err)return}defer conn.Close()
// 添加客户端到广播池clients[conn] = true// 读取消息的goroutinego func() { for { _, message, err := conn.ReadMessage() if err != nil { delete(clients, conn) break } broadcast <- message }}()// 阻塞在此,防止函数退出select {}
}
// 广播消息处理func startBroadcast() {for {msg :=
func main() {go startBroadcast()http.HandleFunc(“/ws”, wsHandler)log.Println(“服务启动在 :8080”)log.Fatal(http.ListenAndServe(“:8080”, nil))}
每个新连接加入
clients
映射,所有消息通过
broadcast
通道统一发送。使用独立的goroutine处理广播,避免阻塞主逻辑。
基本上就这些。通过
gorilla/websocket
可以快速搭建稳定高效的WebSocket服务,结合Go的并发模型,轻松支持高并发实时通信场景。
以上就是Golang实现WebSocket服务 通过gorilla/websocket建立全双工通信的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1399384.html
微信扫一扫
支付宝扫一扫