GO Websocket отправить всем клиентам сообщение

Все отлично работает с этим кодом (сокращен для лучшего чтения).

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

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

Как я могу это сделать? Какие-нибудь примеры или хорошие учебники для начинающих?

Заранее спасибо!

Сервер:

import (
        "github.com/gorilla/websocket"
       )

func main() {
    http.Handle("/server", websocket.Handler(echoHandler)) 
}

func echoHandler(ws *websocket.Conn) {
    conn, err := upgrader.Upgrade(w, r, nil) 
    if err != nil { 
      return
    }
    for {
      messageType, p, err := conn.ReadMessage() 
      if err != nil {
        return
      }

      print_binary(p) // simple print of the message

      err = conn.WriteMessage(messageType, p);
      if err != nil {
        return
      }
    }
}

1 ответ

Решение

Вы должны использовать пул соединений для рассылки сообщений всем соединениям. Вы можете использовать это как учебное пособие / пример http://gary.burd.info/go-websocket-chat

Упрощая:
Пул подключений - это коллекция зарегистрированных подключений. Увидеть hub.connections:

type connection struct {
    // The websocket connection.
    ws *websocket.Conn

    // Buffered channel of outbound messages.
    send chan []byte

    // The hub.
    h *hub
}

type hub struct {
    // Registered connections. That's a connection pool
    connections map[*connection]bool

    ...
}

Чтобы передать сообщение всем клиентам, мы перебираем пул соединений следующим образом:

    case m := <-h.broadcast:
        for c := range h.connections {
            select {
            case c.send <- m:
            default:
                delete(h.connections, c)
                close(c.send)
            }
        }
    }

h.broadcast в этом примере канал с сообщениями, которые нам нужно транслировать.
Мы используем default раздел select оператор для удаления соединений с полными или заблокированными каналами отправки. См. В чем преимущество отправки на канал с помощью select in Go?

Другие вопросы по тегам