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?