Go ошибка websocket: закрыть 1006 (аварийное закрытие): неожиданный EOF - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь написать простой go сервер веб-сокетов с gorilla / 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() выдает ошибку и закрывает веб-сокет, но я не знаю, почему .

Ошибка close 1006 (abnormal closure): unexpected EOF. Как я могу предотвратить это?

1 Ответ

1 голос
/ 09 апреля 2020

Ошибка указывает, что узел закрыл соединение, не отправив сообщение о закрытии. RF C называет это «ненормальным закрытием», но ошибка является нормальной для получения.

Используйте IsUnexpectedCloseError , чтобы отфильтровать ожидаемые ошибки закрытия. Пример чата Gorilla показывает, как использовать функцию ( просмотреть код здесь ).

Приложение в вопросе имеет гонку данных на clients, на что указывает Адриан. Пример чата Gorilla показывает, как вести карту клиентов без гонки данных ( hub ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...