go - 使用 Websocket 向客户端广播服务器端消息
问题描述
我是 Golang 的新手,我正在尝试创建一个 WebSocket 服务器,它将向连接的客户端广播消息。此处的消息将从服务器端生成(通过创建默认客户端)。
这是我的客户.go
c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
if err != nil {
log.Fatal("dial:", err)
}
defer c.Close()
done := make(chan struct{})
new_chan := make(chan string)
//defer new_chan.Stop()
go func() {
for {
new_chan <- "my message"
}
}()
hub := newHub()
go hub.run()
client := &Client{hub: hub, ws: c, send: make(chan []byte, 256)}
for {
select {
case <-done:
return
case t := <-new_chan:
err := c.WriteMessage(websocket.TextMessage, []byte(t))
if err != nil {
log.Println("write:", err)
return
}
log.Printf(t)
client.hub.broadcast <- bytes.TrimSpace(bytes.Replace([]byte(t), newline, space, -1))
}
}
此函数将生成消息并尝试向其他客户端广播。
server.go 将客户端添加到集线器
func echo(w http.ResponseWriter, r *http.Request) {
c, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Print("upgrade:", err)
return
}
hub := newHub()
go hub.run()
client := &Client{hub: hub, ws: c, send: make(chan []byte, 256)}
client.hub.register <- client
go client.writePump()
这里的 writePump() 将监听 client.send 频道和广播消息 现在连接的客户端的集线器与服务器端的客户端集线器不同。因此,当我尝试发送消息时,我什么也没有收到。我怎样才能让它属于同一个集线器(上下文)?
解决方案
看起来您是从Gorilla 聊天示例开始的。在该示例中,用于hub.broadcast <- message
将消息广播到在hub
中*Hub
创建的所有客户端main()
。
无需创建客户端连接即可发送源自服务器的消息。
这是 main() 的修改版本,它每秒向所有客户端广播“hello”:
func broadcast(hub *Hub) {
m := []byte("hello")
for range time.NewTicker(time.Second).C {
hub.broadcast <- m
}
}
func main() {
flag.Parse()
hub := newHub()
go hub.run()
go broadcast(hub)
http.HandleFunc("/", serveHome)
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
serveWs(hub, w, r)
})
err := http.ListenAndServe(*addr, nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
推荐阅读
- flutter - 我们如何在颤动下拉列表中使用数字而不是字符串项目
- javascript - java中的javascript执行失败,XPathResult未定义
- python - 如何使用 python Logger 在烧瓶服务中记录自定义数据
- javascript - 将文件从 multer node.js 放到云端
- postgresql - 如何为 PostgreSQL 中的特定表打开更改跟踪?
- c++ - std::is_same_v<> 为使用类型声明的枚举返回 false?
- php - Laravel 将用户名同步到数据透视表中
- x86 - 串口的mmap IO口地址
- django - 在 django 应用程序中获取所有模型名称时出错
- c++ - 如何在 C++ 中迭代 Aws::Crt::Map