亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 278 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號