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
}
我相信这个问题和
但我在 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
}