首页 文章

如何从Go WebSocket处理程序访问其他客户端连接?

提问于
浏览
1

注意:我对理解一般的Go概念/模式更感兴趣,而不是解决这个人为的例子 .

Go(golang)WebSocket包提供了一个简单的echo server example,它压缩成这样的东西:

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

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

服务器处理同时连接,我试图通过回显所有连接客户端的输入将其升级到基本聊天服务器 .

我如何为每个打开的连接提供EchoServer处理程序访问权限?

1 回答

  • 6

    一个快速的几乎功能性的例子来给你一个想法

    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);
    }
    

    这将启动一个侦听两个通道的goroutine,一个用于添加新连接,另一个用于发送到所有活动连接的消息 . somekindofstorage 可以是 Map 或矢量 .

    编辑:

    或者,您可以将所有连接存储在全局映射中,并从 EchoServer 写入每个连接 . 但是 Map 不是为了同时访问而设计的 .

相关问题