【问题标题】:gin-gonic and gorilla/websocket does not propagate messagegin-gonic 和 gorilla/websocket 不传播消息
【发布时间】:2017-06-21 04:26:41
【问题描述】:

所以我对这个示例进行了一些更改,以使其与 gin-gonic 一起使用 https://github.com/utiq/go-in-5-minutes/tree/master/episode4

多个客户端之间的 websocket 握手成功。问题是当客户端发送消息时,消息不会传播到其余客户端。

【问题讨论】:

  • 您是否能够毫无问题地运行该示例?我们不知道,您对示例做了哪些更改?您能否在 play.golang.org 上创建一个代码 sn-p 来重现您的问题?
  • 是的,我能够运行该示例而没有任何问题。更改在提交历史记录中:github.com/utiq/go-in-5-minutes/commit/…
  • 完成你的提交,将会返回
  • 您有机会验证答案吗?
  • 嘿@jeevatkm 非常感谢您的回答。我无法检查它,因为我开始使用该应用程序的另一个功能,因为我被困在那个部分。我明天去看看。总的来说,我认为您的更改将解决问题。

标签: go gorilla


【解决方案1】:

我查看了您的 commit changesepisode4

我的观察如下:

  • 您正在为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)
})

【讨论】:

  • 我进行了更改,但是当我尝试连接时出现此错误:失败:WebSocket 握手期间出错:意外响应代码:404 我正在尝试做的是从 AngularJS 应用程序连接,所以我像这样调用 websocket ws = new $WebSocket("ws://127.0.0.1:8085/ws");
  • 我能够通过答案中提到的更改在本地执行。让我把第4集的PR发给你,你可以根据需要改进它。
  • 太棒了!尝试在不同的脚本中实现它是我的错误。谢谢@jeevatkm!!
  • 你知道如何制作这个“多房间”吗?
  • 是的,让我们在 Github 或 SO chat 上进行对话,但不在此问答中。
猜你喜欢
  • 2015-09-04
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 2020-03-03
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
相关资源
最近更新 更多