1 回答

TA貢獻1862條經驗 獲得超6個贊
如果客戶端請求子協議并且服務器不同意這些子協議之一,則客戶端需要關閉連接??蛻舳耸褂?Sec-Websocket-Protocol 標頭來請求一個或多個子協議。服務器使用 Sec-Websocket-Protocol 響應標頭來同意協議。有關此主題的更多信息,請參閱RFC 。
通過同意客戶端請求的協議之一來解決問題。有幾種方法可以做到這一點。
第一種是使用內置的協議協商功能:
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
Subprotocols: []string{ "hey" }, // <-- add this line
CheckOrigin: func(r *http.Request) bool {
return true
},
}
第二種是在調用 Upgrade 之前在應用程序代碼中協商協議。調用websocket.Subprotocols獲取請求的協議,選擇其中一種協議并在升級的標頭參數中指定該協議。
h := http.Header{}
for _, sub := range websocket.Subprotocols(req) {
if sub == "hey" {
h.Set("Sec-Websocket-Protocol", "hey")
break
}
}
conn, err := upgrader.Upgrade(w, r, h)
除了這個問題之外,應用程序應該defer conn.Close()在成功升級后。
此外,還可以簡化錯誤處理邏輯。應用程序應在從 ReadMessage 返回任何錯誤時退出讀取循環。連接錯誤后寫入消息是沒有意義的。ReadMessage 方法在成功時返回非零消息。
for {
// Read message from browser
_, msg, err := conn.ReadMessage()
if err != nil {
fmt.Println(err.Error())
fmt.Println("disconnected")
return
}
WriteOutgoingMessage(conn, userID.Hex() + " " + string(msg))
}
- 1 回答
- 0 關注
- 208 瀏覽
添加回答
舉報