为了账号安全,请及时绑定邮箱和手机立即绑定

WebSocket - 关闭握手大猩猩

WebSocket - 关闭握手大猩猩

Go
蝴蝶不菲 2021-12-13 18:34:18
来自 WebSocket RFC 的片段:要使用状态代码(第 7.4 节)/code/ 和可选的关闭原因(第 7.1.6 节)/reason/启动 WebSocket 关闭握手,端点必须发送一个关闭控制帧,如第 5.5.1 节所述,其状态代码设置为 /code/,关闭原因设置为 /reason/。一旦端点既发送又接收关闭控制帧,该端点应该按照第 7.1.1 节中的定义关闭 WebSocket 连接。我正在尝试使用带有以下代码的Gorilla WebSocket包进行关闭握手:服务器:// Create upgrader functionconn, 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(正常):woops然而,客户端就像在发送关闭消息后停止读取一样。将ReadMessage继续返回错误1005我在做什么错?
查看完整描述

1 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

服务器使用以下代码响应关闭帧:


    c.WriteControl(CloseMessage, []byte{}, time.Now().Add(writeWait))

这被客户端转换为关闭代码 1005(未收到状态)。


客户端应用程序看不到服务器写入的 1000 oops 关闭帧,因为 websocket 连接在收到第一个关闭帧后停止从网络读取。


从 ReadMessage 返回错误时,客户端应用程序应退出循环。无需检查特定的关闭代码。


for {

    // Read Messages

    _, _, err := conn.ReadMessage()

    if err != nil {

        break

    }

}

与问题中的问题无关,服务器应用程序应该在发送关闭帧后关闭websocket 连接。


同样与问题中的问题无关,使用select {}而不是for {}阻止主 goroutine。前者只是阻塞了 goroutine。后者使用 CPU 时间旋转。


查看完整回答
反对 回复 2021-12-13
  • 1 回答
  • 0 关注
  • 284 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号