2015-10-16 2 views
2

Я считаю, что этот вопрос почти то же самое с this.GO WebSocket отправить всем клиентам сообщение в Echo Framework

Но я использую WebSocket в Эха рамках вместо гориллы. Поэтому я думаю, что подход будет другим.

Echo предоставляет example. Но это только показывает, как подключиться к одному клиенту. При наличии нескольких клиентов другие клиенты не получают сообщения от сервера.

Как передать серверу сообщение для всех подключенных клиентов?

В принятом ответе от упомянутой ссылки говорится, что я должен использовать пул соединений для широковещательных сообщений для всех соединений. Как я могу сделать это в среде Echo?

спасибо.

ответ

2

Вам действительно нужно следовать тому же принципу пула соединений.

Вот пример 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 
} 
+0

Спасибо много, Гектор. У меня это работало как шарм. – asubanovsky

Смежные вопросы