Фрагмент из WebSocket RFC:
Чтобы запустить рукопожатие закрытия WebSocket с кодом состояния (раздел 7.4) / code / и необязательной причиной закрытия (раздел 7.1.6) / reason /, конечная точка ДОЛЖНА отправить кадр управления Close, как описано в Разделе 5.5.1, код состояния которого установлен на / code /, а причина закрытия установлена на / reason /. Как только конечная точка отправила и получила кадр управления Close, этой конечной точке СЛЕДУЕТ закрыть соединение WebSocket, как определено в разделе 7.1.1.
Я пытаюсь выполнить Close Handshake, используя пакет Gorilla WebSocket со следующим кодом:
Сервер:
// Create upgrader function
conn, err := upgrader.Upgrade(w, r, nil)
// If there is an error stop everything.
if err != nil {
fmt.Println(err)
return
}
for {
// Read Messages
_, _, err := conn.ReadMessage()
// Client is programmed to send a close frame immediately...
// When reading close frame resend close frame with same
// reason and code
conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(1000, "woops"))
fmt.Println(err)
break
}
Клиент:
d := &websocket.Dialer{}
conn, _, err := d.Dial("ws://localhost:8080", nil)
if err != nil {
fmt.Println(err)
return
}
go func() {
for {
// Read Messages
_, _, err := conn.ReadMessage()
if c, k := err.(*websocket.CloseError); k {
if(c.Code == 1000) {
// Never entering since c.Code == 1005
fmt.Println(err)
break
}
}
}
}()
conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(1000, "woops"))
for {}
Сервер читает Close Frame, как и ожидалось, выводя следующее:
websocket: закрыть 1000 (нормальный): woops
Однако клиент как бы останавливается, чтобы читать, как только он отправляет сообщение о закрытии. ReadMessage
продолжает возвращать ошибку 1005. Что я делаю не так?