我是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,我都可以向所有客户端进行广播。 希望我说清楚。
答案 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