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

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

Sec-Websocket-協議問題

Sec-Websocket-協議問題

Go
人到中年有點甜 2023-07-31 15:08:41
我在使用 WebSockets 協議時遇到 Go 問題。如果我連接到我的 API,一切都會正常。如果我添加“協議”,例如“Hey”,它會開始循環多次,并以錯誤結束*github.com/gorilla/websocket.CloseError:“Code 1006,Text Unexpected EOF”。Sec-Websocket-Protocol我絕對不明白為什么當我在連接中發送時它會這樣。有我的代碼:main.gopackage mainimport (    "fmt"    "github.com/golang/glog"    "github.com/grpc-ecosystem/grpc-gateway/runtime"    stacktracer "gitlab.com/eyes-eyes/internals-stacktracer"    "gitlab.com/eyesbank/go-web-sockets-server/handlers"    "net/http")const webSocketsAddr = "0.0.0.0:8082"// main is the starting point of the current micro service.func main() {    // Setting the service name    stacktracer.SetServiceName("Hello 'X' (Web Sockets)")    // Initializing the HTTP errors handling    runtime.HTTPError = stacktracer.DefaultHTTPError    if err := RunWebSocketsServer(); err != nil {        glog.Fatal(err)    }}//// WebSocket//func RunWebSocketsServer() error {    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {        handlers.HandleUserSocket(w, r)    })    fmt.Println(webSocketsAddr)    return http.ListenAndServe(webSocketsAddr, nil)}func RunWebSocketsTLSServer() error {    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {        handlers.HandleUserSocket(w, r)    })    fmt.Println(webSocketsAddr)    return http.ListenAndServeTLS(webSocketsAddr, "server.crt", "server.key", nil)}
查看完整描述

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))

}

           


查看完整回答
反對 回復 2023-07-31
  • 1 回答
  • 0 關注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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