gin-gonic 和 gorilla/websocket 不传播消息
gin-gonic and gorilla/websocket does not propagate message
所以我对这个例子做了一些修改,让它与 gin-gonic 一起工作
https://github.com/utiq/go-in-5-minutes/tree/master/episode4
多个客户端之间的websocket握手成功。问题是当客户端发送消息时,消息不会传播到其余客户端。
我看过你的 commit changes of episode4
。
我的观察如下:
- 您正在为 stream handler 的每个传入请求创建
hub
实例。 hub
用于跟踪连接等的实例,因此您在每次请求时都会丢失它。
- 您已删除 index/home 处理程序(可能您想转换为 gin 处理程序或其他内容,我不知道)。
现在,让我们episode4
付诸行动。请进行以下更改(一如既往地根据需要进行改进)。我已经通过以下更改测试了您的 episode4
,它工作正常。
使 /ws
处理程序在 server.go
上工作:
h := newHub()
wsh := wsHandler{h: h}
r.GET("/ws", func(c *gin.Context) {
wsh.ServeHTTP(c.Writer, c.Request)
})
删除 connection.go
上的流处理程序:
func stream(c *gin.Context) {
h := newHub()
wsHandler{h: h}.ServeHTTP(c.Writer, c.Request)
}
在 server.go
上添加索引 HTML 处理程序:(在我最后将其添加到测试第 4 集)
r.SetHTMLTemplate(template.Must(template.ParseFiles("index.html")))
r.GET("/", func(c *gin.Context) {
c.HTML(200, "index.html", nil)
})
所以我对这个例子做了一些修改,让它与 gin-gonic 一起工作 https://github.com/utiq/go-in-5-minutes/tree/master/episode4
多个客户端之间的websocket握手成功。问题是当客户端发送消息时,消息不会传播到其余客户端。
我看过你的 commit changes of episode4
。
我的观察如下:
- 您正在为 stream handler 的每个传入请求创建
hub
实例。hub
用于跟踪连接等的实例,因此您在每次请求时都会丢失它。 - 您已删除 index/home 处理程序(可能您想转换为 gin 处理程序或其他内容,我不知道)。
现在,让我们episode4
付诸行动。请进行以下更改(一如既往地根据需要进行改进)。我已经通过以下更改测试了您的 episode4
,它工作正常。
使 /ws
处理程序在 server.go
上工作:
h := newHub()
wsh := wsHandler{h: h}
r.GET("/ws", func(c *gin.Context) {
wsh.ServeHTTP(c.Writer, c.Request)
})
删除 connection.go
上的流处理程序:
func stream(c *gin.Context) {
h := newHub()
wsHandler{h: h}.ServeHTTP(c.Writer, c.Request)
}
在 server.go
上添加索引 HTML 处理程序:(在我最后将其添加到测试第 4 集)
r.SetHTMLTemplate(template.Must(template.ParseFiles("index.html")))
r.GET("/", func(c *gin.Context) {
c.HTML(200, "index.html", nil)
})