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 的文章 .
以上是對於 Golang Fiber 的 WebSocket 用戶端,如何將 HTTP 用戶端/連線轉變為 WebSocket?的詳細內容。更多資訊請關注PHP中文網其他相關文章!