卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章35681本站已运行398

对于 Golang Fiber 的 WebSocket 客户端,如何将 HTTP 客户端/连接转变为 WebSocket?

对于 golang fiber 的 websocket 客户端,如何将 http 客户端/连接转变为 websocket?

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 的文章 .

卓越飞翔博客
上一篇: 在 Matplotlib 中绘制颜色图
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏