【问题标题】:How to send to only one client and not all clients using Go and gorilla websocket如何使用 Go 和 gorilla websocket 仅发送给一个客户端而不是所有客户端
【发布时间】:2015-07-24 14:04:10
【问题描述】:

我正在尝试使用 Go 学习 websocket。我一直在看 gorilla websocket 的例子。

我查看了这 2 个展示如何使用 gorilla websocket 的示例:

https://github.com/gorilla/websocket/tree/master/examples

https://www.youtube.com/watch?v=ysAZ_oqPOo0

所有这些示例都展示了如何连接到 websocket 服务器、发送和接收文本。但我不明白的是你如何只能发送给一个客户。因为在现实世界的应用程序中,您将拥有用户,我们不希望所有用户都收到相同的消息和相同的数据。有没有办法让我获得连接的唯一 ID,我可以将其保存在像 redis 这样的数据库中,并将其链接到同一数据库中的用户 ID,然后使用该 websocket id 将其发送回特定的客户端(如果是)用户 ID 收到消息或通知?这是一个人将如何去做并实现这样的事情吗?如果是这样,我会怎么做?

【问题讨论】:

  • 将 Gorilla hub 字段从 `connections map[*connection]bool` 更改为 connections map[string]*connection,其中字符串键是 id。将id string 字段添加到连接。在创建连接和地图类型的微小更改时分配 id。完成。
  • 我同意@BravadaZadada。有很多复杂的方法可以实现这一点,但您的需求是基本的。只需在您的地图中为任何新的 websocket.Connection 分配一个唯一键,当您准备写入它时调用 mapname["clientname"].WriteMessage(1, []byte(msg))

标签: go websocket


【解决方案1】:

有没有办法让我获得连接的唯一 ID,我可以 保存在redis之类的数据库中,并将其链接到相同的用户ID 数据库,然后使用该 websocket id 发送回特定的 客户端是否该用户 ID 收到消息或通知?

当然!您可以在用户注册时自己生成 Id。只需在 connection 结构中添加 userId 字段

在聊天示例中,您有集线器,其中包含连接池。该池用于向所有用户广播消息:

case m := <-h.broadcast:
    for c := range h.connections {
        select {
        case c.send <- m:
        default:
            close(c.send)
            delete(h.connections, c)
        }
    }
}

所以你去。您应该制定发送私人消息的方法,取决于 userId

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-14
    • 2012-12-12
    • 2012-12-07
    • 2020-04-23
    • 2020-12-17
    • 1970-01-01
    • 2017-09-08
    • 2016-10-19
    相关资源
    最近更新 更多