将Websocket消息发送到Go中的特定频道(使用Gorilla)

时间:2019-09-04 07:54:55

标签: go websocket gorilla

我是Go的新手,并且发现自己作为第一个项目使用套接字。这是一个多余的问题,但我无法理解如何将Websocket更新发送到Go中的特定频道(使用Gorilla)。

我正在使用code sample from this link

此方法。但是无法修改以将消息发送到特定频道。

这是我的示例代码 main.go

func main() {
flag.Parse()
hub := newHub()
go hub.run()
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
    fmt.Println(hub)
    serveWs(hub, w, r)
})
err := http.ListenAndServe(*addr, nil)
if err != nil {
    log.Fatal("ListenAndServe: ", err)
}

}

还有另外两个文件,分别称为hub.go和client.go 我认为在下面的hub.go上可以做些事情

return &Hub{
    broadcast:  make(chan []byte),
    register:   make(chan *Client),
    unregister: make(chan *Client),
    clients:    make(map[*Client]bool),
}

请提出我应该从此处进行哪些更改? 谢谢你。

****更新**

我想做的是我已经编写了一个套接字服务器。 现在,假设我们有许多写在客户端上的客户端在响应侦听时使用诸如wss://abc.com/wss1之类的特定URL,或者可能是wss://abc.com/wss2

现在,如果客户端wss1向服务器发送消息,则服务器将向所有监听URL wss1而不是wss2的客户端发出此消息,反之亦然。

到目前为止,无论wss1还是wss2,我都可以向所有客户端进行广播。 希望我说清楚。

1 个答案:

答案 0 :(得分:1)

要将“频道”或“聊天室”功能添加到Gorilla聊天示例,请执行以下操作。在此答案中,我将使用“房间”一词,以避免与Go频道混淆。

为包含有效负载和房间标识符的消息定义类型:

type message struct {
   roomID string
   data []byte
}

将中心广播频道替换为:

broadcast chan message

在“客户”类型中添加房间标识符:

type Client struct {
    roomID string
    hub *Hub
    ...
}

处理程序从request URI中提取房间标识符,并在创建Client和发送message时设置房间标识符。

Hub的{​​{1}}字段更改为以房间标识符为键的地图。初始化集线器时,适当地初始化此字段。

clients

更改// Registered clients by room rooms map[string]map[*Client]bool Hub函数以使用房间。该代码在结构上与原始示例中的代码相似。

run