Почему он закрыл соединение напрямую по истечении времени ожидания, а не вызвал метод closeHandler? - PullRequest
0 голосов
/ 15 мая 2018

Почему он закрыл соединение напрямую по истечении времени ожидания, а не вызвал метод closeHandler?

ws.SetCloseHandler(func(code int, text string) error {
    fmt.Println("socket close")
}
// can not get "socket close"
stdout: "websocket: close 1006 (abnormal closure): unexpected EOF"

package: "github.com/gorilla/websocket"

1 Ответ

0 голосов
/ 15 мая 2018

Вебсокет RFC говорит о статусе 1006:

1006 является зарезервированным значением и НЕ ДОЛЖНО быть установлено в качестве кода состояния в Закрыть контрольный кадр конечной точкой. Он предназначен для использования в приложения, ожидающие код состояния, чтобы указать, что соединение было закрыто ненормально, например, без отправки или получение кадра управления Close.

Документация к пакету для веб-сокетов гласит:

SetCloseHandler устанавливает обработчик для закрытых сообщений, полученных от однорангового узла

Обработчик закрытия не был вызван, поскольку сообщение о закрытии не было получено. Узел закрыл соединение, не отправив сообщение о закрытии.

В документации пакета также указано:

Методы чтения соединения возвращают CloseError при получении сообщения о закрытии. Большинство приложений должны обрабатывать закрытые сообщения как часть своей обычной обработки ошибок. Приложения должны устанавливать обработчик закрытия только в том случае, если приложение должно выполнить какое-то действие перед отправкой сообщения закрытия узлу.

Поскольку обработчик в вопросе не отправляет закрывающее сообщение и не предпринимает никаких других действий, обработчик закрытия в вопросе не требуется. Обработчик вреден, потому что он не отображает сообщение о закрытии.

Удалите обработчик закрытия и обработайте сообщения закрытия как часть обычной обработки ошибок приложения.

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