アイデアを提供するための、ほぼ機能的な簡単な例
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);
}
これにより、2 つのチャネルでリッスンするゴルーチンが開始されます。1 つは新しい接続を追加するためのもので、もう 1 つはすべてのアクティブな接続に送信するメッセージのためのものです。somekindofstorage
マップまたはベクトルである可能性があります。
編集:
または、すべての接続をグローバル マップに保存し、それぞれに から書き込むこともできますEchoServer
。ただし、マップは同時にアクセスできるようには設計されていません。