第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

Sec-Websocket-協(xié)議問題

Sec-Websocket-協(xié)議問題

Go
人到中年有點(diǎn)甜 2023-07-31 15:08:41
我在使用 WebSockets 協(xié)議時(shí)遇到 Go 問題。如果我連接到我的 API,一切都會正常。如果我添加“協(xié)議”,例如“Hey”,它會開始循環(huán)多次,并以錯(cuò)誤結(jié)束*github.com/gorilla/websocket.CloseError:“Code 1006,Text Unexpected EOF”。Sec-Websocket-Protocol我絕對不明白為什么當(dāng)我在連接中發(fā)送時(shí)它會這樣。有我的代碼: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 回答

?
阿波羅的戰(zhàn)車

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

}

           


查看完整回答
反對 回復(fù) 2023-07-31
  • 1 回答
  • 0 關(guān)注
  • 218 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號