1 回答

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果客戶端請求子協(xié)議并且服務(wù)器不同意這些子協(xié)議之一,則客戶端需要關(guān)閉連接。客戶端使用 Sec-Websocket-Protocol 標(biāo)頭來請求一個(gè)或多個(gè)子協(xié)議。服務(wù)器使用 Sec-Websocket-Protocol 響應(yīng)標(biāo)頭來同意協(xié)議。有關(guān)此主題的更多信息,請參閱RFC 。
通過同意客戶端請求的協(xié)議之一來解決問題。有幾種方法可以做到這一點(diǎn)。
第一種是使用內(nèi)置的協(xié)議協(xié)商功能:
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
Subprotocols: []string{ "hey" }, // <-- add this line
CheckOrigin: func(r *http.Request) bool {
return true
},
}
第二種是在調(diào)用 Upgrade 之前在應(yīng)用程序代碼中協(xié)商協(xié)議。調(diào)用websocket.Subprotocols獲取請求的協(xié)議,選擇其中一種協(xié)議并在升級的標(biāo)頭參數(shù)中指定該協(xié)議。
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)
除了這個(gè)問題之外,應(yīng)用程序應(yīng)該defer conn.Close()在成功升級后。
此外,還可以簡化錯(cuò)誤處理邏輯。應(yīng)用程序應(yīng)在從 ReadMessage 返回任何錯(cuò)誤時(shí)退出讀取循環(huán)。連接錯(cuò)誤后寫入消息是沒有意義的。ReadMessage 方法在成功時(shí)返回非零消息。
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 關(guān)注
- 218 瀏覽
添加回答
舉報(bào)