2010-08-25 5 views
1

Note: Je suis plus intéressé par la compréhension des concepts/modèles généraux de Go, plutôt que par la résolution de cet exemple artificiel.Comment accéder à d'autres connexions client à partir d'un gestionnaire Go WebSocket?

The Go (golang) package WebSocket fournit un echo server example trivial, qui se condense à quelque chose comme ceci:

func EchoServer(ws *websocket.Conn) { io.Copy(ws, ws); } 

func main() { 
http.Handle("/echo", websocket.Handler(EchoServer)); 
http.ListenAndServe(":12345", nil); 
} 

Le serveur gère les connexions simultanées, et je suis en train de passer à une conversation de base serveur en faisant écho l'entrée à tous les clients connectés.

Comment pourrais-je fournir l'accès au gestionnaire EchoServer à chacune des connexions ouvertes?

Répondre

6

Un petit exemple presque fonctionnelle rapide pour vous donner une idée

var c = make(chan *websocket.Conn, 5) //5 is an arbitrary buffer size 
var c2 = make(chan []byte, 5) 
func EchoServer(ws *websocket.Conn) { 
    buff := make([]byte, 256) 
    c <- ws 
    for size, e := ws.Read(buff); e == nil; size, e = ws.Read(buff) { 
     c2 <- buff[0:size] 
    } 
    ws.Close() 
} 
func main() { 
    go func() { 
     var somekindofstorage 
     for { 
      select { 
      case newC := <-c: 
       somekindofstorage.Add(newC) 
      case msg := <-c2: 
       for _, v := range somekindofstorage { 
        if _, e := v.Write(msg); e != nil { //assuming the client disconnected on write errors 
         somekindofstorage.Remove(v) 
        } 
       } 
      } 
     } 
    }() 
    http.Handle("/echo", websocket.Handler(EchoServer)); 
    http.ListenAndServe(":12345", nil); 
} 

Cela commence un goroutine qui écoute sur deux canaux, un pour de nouvelles connexions pour ajouter et un pour les messages à envoyer à tout lien actif. somekindofstorage pourrait être une carte ou un vecteur.

Edit:

Sinon, vous pouvez simplement stocker toutes les connexions dans une carte globale et écrire à chacun de EchoServer. Mais les cartes ne sont pas conçues pour être accessibles simultanément.

+0

Bien, merci. Je voterais votre réponse si on me le permettait. Je vais vérifier plus en détail quand je rentre à la maison. À la votre! –

Questions connexes