php小編新一為您帶來了關于Golang Fiber的WebSocket客戶端的轉變問題的解答。在使用Golang Fiber進行開發時,有時我們需要將HTTP客戶端或連接轉換為WebSocket客戶端。這樣可以在同一個連接上實現HTTP和WebSocket的雙向通信。接下來,我們將詳細介紹如何實現這一轉變過程。通過以下步驟,您將能夠輕松地在Golang Fiber中使用WebSocket客戶端進行開發。
問題內容
有關背景信息,請參閱最近的這篇 stackoverflow 文章。
我正在使用 Golang Fiber 設置 WebSockets 服務,如下所示:
app.Use("/ws", handler.UpgradeHandler) app.Get("/ws/:id", websocket.New(func(ws *websocket.Conn) { handler.MediaStreamHandler(ws) }))
登錄后復制
使用 UpgradeHandler
中間件,如下所示:
func UpgradeHandler(c *fiber.Ctx) error { // IsWebSocketUpgrade returns true if the client // requested upgrade to the WebSocket protocol. if websocket.IsWebSocketUpgrade(c) { log.Info("request to open WebSockets channel") return c.Next() } return fiber.ErrUpgradeRequired }
登錄后復制
期望該服務的 HTTP 客戶端向 http://chat.acme.ai:80/ws/123
等發出 HTTP GET 請求,并強制 Fiber 服務器打開 WebSockets 服務。例如:
func MediaStreamHandler(c *websocket.Conn) { ... for { if mt, buf, err = c.ReadMessage(); err != nil { ... } ... }
登錄后復制
我們在其中攝取流媒體,直到 WebSocket 關閉。
問題:如果客戶端向 Fiber 服務發起 HTTP GET 請求以啟動 Fiber 端的 WebSockets 服務,那么客戶端邏輯如何將其 HTTP 客戶端轉變為 WebSockets 客戶端?
直觀上,我們只是在某個地方有一個套接字,將 HTTP 客戶端升級到 WebSockets 客戶端只是將正確的“粘合劑”添加到 HTTP 客戶端。但從使用 Java WebSockets 等固定解決方案的角度來看,完全不清楚如何將 HTTP 客戶端轉變為 WebSockets 客戶端。
解決方法
Golang/Fiber 在這里是偶然的。根據定義,WebSockets 協議向某個服務端點發起 HTTP GET 請求;在握手期間,傳輸協議從 HTTP 升級為 WebSockets。該升級的一部分是請求和響應中的 HTTP 標頭都被修改。請參閱下面的聊天相關示例。
升級后的請求標頭:
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHmbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: http://example.com
登錄后復制
服務器響應:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sM1YUkAGmm50PpG2HaGWk= Sec-WebSocket-Protocol: chat
登錄后復制
這些示例來自這篇有關 WebSockets 的文章 .