Websocket在Echo Framework

时间:2015-10-16 04:41:20

标签: go websocket echo-framework

我认为这个问题几乎与this.

相同

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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