來自 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 時間旋轉。
- 1 回答
- 0 關注
- 278 瀏覽
添加回答
舉報
0/150
提交
取消