2015-10-16 67 views
2

我认为,这个问题几乎与this.GO的WebSocket发送的所有客户端的消息在回声框架

相同的,但我在回声框架,而不是大猩猩使用的WebSocket。所以我认为这种做法会有所不同。

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

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

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

谢谢。

回答

2

你确实需要遵循连接池的相同原理。

这里是回声例子,一个非常基本实现一池:

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 
} 
+0

非常感谢,赫克托。我的工作就像一个魅力。 – asubanovsky

相关问题