Широковещательные сообщения о завершении сервера клиентам, использующим Websockets - PullRequest
0 голосов
/ 05 июня 2018

Я новичок в Golang, я пытаюсь создать сервер WebSocket, который будет передавать сообщения подключенным клиентам.Сообщения здесь будут генерироваться со стороны сервера (путем создания клиента по умолчанию).

Вот мой client.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 и широковещательные сообщения. Теперь хаб подключенного клиента другойэто из хаба клиента на сервере.Поэтому, когда я пытаюсь отправить сообщения, я ничего не получаю.Как сделать так, чтобы он принадлежал одному и тому же хабу (контексту)?

1 Ответ

0 голосов
/ 05 июня 2018

Похоже, вы начинаете с примера чата Gorilla .В этом примере используйте hub.broadcast <- message для широковещательной рассылки сообщения всем клиентам, где hub является *Hub, созданным в main().

Нет необходимости создавать клиентское соединение для отправки сообщения, полученного изсервер.

Вот модифицированная версия main (), которая каждую секунду транслирует «привет» всем клиентам:

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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...