【问题标题】:Broadcast server end messages to clients using Websockets使用 Websocket 向客户端广播服务器端消息
【发布时间】:2018-11-14 13:24:40
【问题描述】:

我是 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频道并广播消息 现在连接的客户端的集线器与服务器上的客户端集线器不同。因此,当我尝试发送消息时,我什么也没有收到。 我怎样才能让它属于同一个集线器(上下文)?

【问题讨论】:

    标签: go


    【解决方案1】:

    您似乎是从Gorilla chat example 开始的。在该示例中,使用hub.broadcast &lt;- message 向所有客户端广播一条消息,其中hub 是在main() 中创建的*Hub

    无需创建客户端连接即可发送源自服务器的消息。

    这是 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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-24
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 2022-07-15
      相关资源
      最近更新 更多