如何在 Gin 框架中处理多个 websocket 连接?

ops/2024/9/23 4:50:43/

在Gin框架中处理多个WebSocket连接,你可以使用gorilla/websocket包。以下是一步步的指南:

  1. 首先,在你的终端运行go get github.com/gorilla/websocket来安装gorilla/websocket包。

  2. 创建一个Connection结构体来保存WebSocket连接和发送通道。

  3. 创建一个Hub结构体来保存客户端和广播通道。

  4. Hub实现运行,注册新客户端,注销客户端,以及向所有客户端广播消息的方法。

  5. Connection实现写入和读取消息的方法。

  6. 在你的Gin路由处理器中,将HTTP连接升级为WebSocket连接,创建一个新的Connection对象,将新客户端注册到Hub,并启动写入和读取的goroutines。

以下是你可以如何实现这个的示例:

package mainimport ("github.com/gin-gonic/gin""github.com/gorilla/websocket""net/http"
)var upgrader = websocket.Upgrader{ReadBufferSize:  1024,WriteBufferSize: 1024,
}type Connection struct {ws   *websocket.Connsend chan []byte
}type Hub struct {connections map[*Connection]boolbroadcast   chan []byteregister    chan *Connectionunregister  chan *Connection
}func newHub() *Hub {return &Hub{broadcast:   make(chan []byte),register:    make(chan *Connection),unregister:  make(chan *Connection),connections: make(map[*Connection]bool),}
}func (h *Hub) run() {for {select {case c := <-h.register:h.connections[c] = truecase c := <-h.unregister:if _, ok := h.connections[c]; ok {delete(h.connections, c)close(c.send)}case m := <-h.broadcast:for c := range h.connections {select {case c.send <- m:default:close(c.send)delete(h.connections, c)}}}}
}func (c *Connection) reader() {for {_, message, err := c.ws.ReadMessage()if err != nil {h.unregister <- cc.ws.Close()break}h.broadcast <- message}
}func (c *Connection) writer() {for message := range c.send {err := c.ws.WriteMessage(websocket.TextMessage, message)if err != nil {break}}c.ws.Close()
}var h = newHub()func wsHandler(c *gin.Context) {ws, err := upgrader.Upgrade(c.Writer, c.Request, nil)if err != nil {return}connection := &Connection{send: make(chan []byte, 256), ws: ws}h.register <- connectiongo connection.writer()go connection.reader()
}func main() {go h.run()r := gin.Default()r.GET("/ws", wsHandler)r.Run("localhost:8080")
}

在这个示例中,当一个客户端连接到"/ws"端点时,会创建一个新的WebSocket连接并注册到hub。hub跟踪所有活动的连接,并将收到的消息广播给所有客户端。


http://www.ppmy.cn/ops/33934.html

相关文章

知乎23届数据分析校招A卷——笔记

1、and 和 or的并列运用[先看and] 条件1 OR 条件2 AND 条件3 执行顺序是先执行AND操作符&#xff08;先看条件2和3&#xff09;&#xff0c;再根据其结果判断是否需要执行OR操作符&#xff0c;并最终返回整个表达式的逻辑结果。 条件1 and 条件2 or 条件3 执行逻辑是先执行…

Rust里的Fn/FnMut/FnOnce和闭包匿名函数关系

闭包&#xff08;英语&#xff1a;Closure&#xff09;&#xff0c;又称词法闭包&#xff08;Lexical Closure&#xff09;或函数闭包&#xff08;function closures&#xff09;&#xff0c;是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在&#xff0c;即使…

Vue 3 中的 h() 与 mergeProps() API 详解

前言 在 Vue 3 中&#xff0c;随着 Composition API 的引入&#xff0c;我们有了更多的灵活性和控制权来构建我们的组件。其中&#xff0c;h() 函数和 mergeProps() 是在构建渲染函数或 JSX/TSX 时经常使用的两个工具。下面&#xff0c;我将对这两个 API 进行详细的解释。 h()…

【centos】vmware安装airflow流程

文章目录 1.下载系统https://mirrors.aliyun.com/centos/7/isos/x86_64/ 选择DVD20092.在VMware中&#xff0c;除了修改安装位置&#xff0c;其它选择默认安装centos73.用户名为root,登录4.网络适配器为桥接模式。5.使用命令消除显示器警告。6.安装anaconda6.1下载包&#xff1…

【微服务】分布式事务(通过Seata解决分布式事务问题)

分布式事务 分布式事务Seata微服务集成SeataXA模式XA模式使用 AT模式AT模式实现 分布式事务 在分布式系统中&#xff0c;如果一个业务需要多个服务合作完成&#xff0c;而且每一个服务都有事务&#xff0c;多个事务必须同时成功或失败&#xff0c;这样的事务就是分布式事务&am…

初识webpack项目

新建一个空的工程 -> % mkdir webpack-project 为了方便追踪执行每一个命令&#xff0c;最终产生了哪些变更&#xff0c;将这个空工程初始化成git项目 -> % cd webpack-project/-> % git init Initialized empty Git repository in /Users/lixiang/frontworkspace/…

React-Native制作一个通过照片和视频识别鸟类的安卓app

前言 首先简单介绍一下这个app是干啥的,实际上我的标题已经差不多说完了.....就是用户可以上传带有鸟类的图片或者视频,然后就可以得到相应的识别效果,这个app的需求是来自于我的一位朋友,所以我就做出来了 正文 讲一下基本用到的技术栈吧,前端用的react-native,后端用的是f…

(三)JVM实战——对象的内存布局与执行引擎详解

对象的内存布局 对象的实例化 对象的创建方式 - new的方式 - Class的newInstance():反射的方式 - Construct的newInstance() - clone:实现Cloneable接口,默认浅拷贝 - 使用反序列化&#xff1a;将二进制流转化为内存对象 创建对象的步骤 - 判断对象对应的类是否加载、链接、初…