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

标签 go websocket

注意:我更感兴趣的是理解一般的 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 处理程序提供对每个打开的连接的访问​​权限?

最佳答案

一个几乎可以正常运行的小例子,给你一个想法

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,它监听两个 channel ,一个用于添加新连接,一个用于向所有事件连接发送消息。 somekindofstorage 可以是 map 或矢量。

编辑:

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

关于go - 如何从 Go WebSocket 处理程序访问其他客户端连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3566288/

相关文章:

javascript - 关闭窗口/选项卡时的 Websocket - Chrome

express - Mocha websocket 测试不会可靠地失败/通过

javascript - 如何获取 javascript websocket 连接的当前状态

go - 使用可变参数调用 golang println

go - runtime.adjustdefers 在 pprof 输出中意味着什么?

python - 使用 ws4py 创建自己的应用程序

html - 加载 Jade -> HTML 通过 Websockets + NodeJS 而不是 AJAX

go - 围棋练习之旅#10 : Crawler

go - Terratest 多个目标

pointers - Golang自定义单链表的误解