为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕斯709654 2021-11-15 16:51:00
我相信这个问题与this几乎相同。但是我在 Echo 框架中使用 websocket 而不是 Gorilla。所以我认为方法会有所不同。Echo 确实提供了示例。但它只显示了如何与单个客户端连接。当有多个客户端时,其他客户端不会收到来自服务器的消息。如何让服务器向所有连接的客户端广播消息?来自引用链接的接受答案说我必须使用连接池向所有连接广播消息。我怎样才能在 Echo 框架中做到这一点?
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

您确实需要遵循连接池的相同原则。


这是 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

}



查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 303 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信