dpw5865 2015-10-16 04:41
浏览 170
已采纳

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

I believe that this question is almost the same with this.

But I use websocket in Echo framework instead of Gorilla. So I think the approach will be different.

Echo does provide the example. But it only shows how to connect with single client. When there are more than one client, the other clients don't receive message from server.

How do I make the server broadcasts message to all connected clients?

The accepted answer from referred link says that I have to use connection pool to broadcast messages to all connections. How can I do this in Echo framework?

  • 写回答

1条回答

  • douyingbei1458 2015-10-16 06:26
    关注

    You indeed need to follow the same principle of connection pool.

    Here is the Echo example, with a very basic implementation of a pool:

    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
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。