一尘不染

GO Websocket向所有客户发送消息

go

这段代码一切正常(将其缩短以便更好地阅读)。

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
      }
    }
}

阅读 528

收藏
2020-07-02

共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语句具有完全或阻止发送通道删除连接。

2020-07-02