首页 > 解决方案 > Go websocket错误:关闭1006(异常关闭):意外EOF

问题描述

我正在尝试使用 gorilla/websocket 编写一个简单的 go websocket 服务器

http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
    if os.Getenv("env") == "development" {
        upgrader.CheckOrigin = func(r *http.Request) bool { return true }
    }

    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Printf("Websocket error: %s", err)
        return
    }

    defer conn.Close()

    // Register client
    clients[conn] = true

    for {
        message := message.Message{}
        _, msg, err := conn.ReadMessage()
        if err != nil {
            log.Printf("Websocket error: %s", err)
            return
        }

        res, _ = json.Marshal(context.Game)

        // Send to every client that is currently connected
        for client := range clients {
            err := client.WriteMessage(websocket.TextMessage, res)
            if err != nil {
                // Remove connection
                client.Close()
                delete(clients, client)
            }
        }
    }
})

_, msg, err := conn.ReadMessage()行抛出错误并关闭 websocket,但我不知道为什么。

错误是close 1006 (abnormal closure): unexpected EOF。我怎样才能防止这种情况?

标签: gowebsocket

解决方案


该错误表明对等方关闭了连接而没有发送关闭消息。RFC 将此称为“异常关闭”,但接收到的错误是正常的。

使用IsUnexpectedCloseError过滤掉预期的关闭错误。大猩猩聊天示例展示了如何使用该功能(在此处查看代码)。

clients正如 Adrian 所指出的,问题中的应用程序存在数据竞争。Gorilla 聊天示例展示了如何在没有数据竞争(集线器)的情况下维护客户端地图。


推荐阅读