Websocket 在 Echo 框架中向所有客户端发送消息

我相信这个问题与this几乎相同

但是我在 Echo 框架中使用 websocket 而不是 Gorilla。所以我认为方法会有所不同。

Echo 确实提供了示例。但它只显示了如何与单个客户端连接。当有多个客户端时,其他客户端不会收到来自服务器的消息。

如何让服务器向所有连接的客户端广播消息?

来自引用链接的接受答案说我必须使用连接池向所有连接广播消息。我怎样才能在 Echo 框架中做到这一点?


慕斯709654
浏览 304回答 1
1回答

江户川乱折腾

您确实需要遵循连接池的相同原则。这是 Echo 示例,其中包含一个非常基本的池实现:package mainimport (    "fmt"    "sync"    "github.com/labstack/echo"    mw "github.com/labstack/echo/middleware"    "golang.org/x/net/websocket")var connectionPool = struct {    sync.RWMutex    connections map[*websocket.Conn]struct{}}{    connections: make(map[*websocket.Conn]struct{}),}func main() {    e := echo.New()    e.Use(mw.Logger())    e.Use(mw.Recover())    e.Static("/", "public")    e.WebSocket("/ws", func(c *echo.Context) (err error) {        ws := c.Socket()        connectionPool.Lock()        connectionPool.connections[ws] = struct{}{}        defer func(connection *websocket.Conn){            connectionPool.Lock()            delete(connectionPool.connections, connection)            connectionPool.Unlock()        }(ws)        connectionPool.Unlock()        msg := ""        for {            if err = websocket.Message.Receive(ws, &msg); err != nil {                return err            }            err = sendMessageToAllPool(msg)            if err != nil {                return err            }            fmt.Println(msg)        }        return err    })    e.Run(":1323")}func sendMessageToAllPool(message string) error {    connectionPool.RLock()    defer connectionPool.RUnlock()    for connection := range connectionPool.connections {        if err := websocket.Message.Send(connection, message); err != nil {            return err        }    }    return nil}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go