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

Websocket send all clients a message in Echo Framework

我相信这个问题和

差不多

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

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

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

引用的 link 接受的答案说我必须使用连接池向所有连接广播消息。我如何在 Echo 框架中执行此操作?

你确实需要遵循同样的连接池原则。

这是 Echo 示例,其中包含一个非常基本的池实现:

package main

import (
    "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
}