【发布时间】:2016-02-15 17:49:12
【问题描述】:
来自 WebSocket RFC 的片段:
要使用状态码(第 7.4 节)/code/ 和可选的关闭原因(第 7.1.6 节)/reason/ 启动 WebSocket 关闭握手,端点必须发送关闭控制帧,如 5.5.1 节所述,其状态码设置为 /code/,其关闭原因设置为 /reason/。一旦端点发送和接收了关闭控制帧,该端点应该关闭 WebSocket 连接,如第 7.1.1 节中定义的那样。
我正在尝试使用带有以下代码的 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 {}
服务器正在按预期读取关闭帧,输出以下内容:
websocket:关闭 1000(正常):呜呜呜
但是,客户端就像它在发送关闭消息后停止阅读一样。 ReadMessage 继续返回错误 1005。我做错了什么?
【问题讨论】:
标签: go websocket handshake gorilla