相信这个问题和this.差不多

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

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

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

来自引用链接的接受答案说我必须使用连接池向所有连接广播消息。我怎样才能在 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
}

关于go - Websocket 在 Echo 框架中向所有客户端发送消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33162687/

10-13 03:30