返回顶部
首页 > 资讯 > 精选 >如何使用 Gorilla Websockets 和 alexedwards/scs/v2 实现 http.Hijacker
  • 698
分享到

如何使用 Gorilla Websockets 和 alexedwards/scs/v2 实现 http.Hijacker

2024-02-10 14:02:18 698人浏览 安东尼
摘要

PHP小编苹果今天为大家介绍一种使用Gorilla websockets和alexedwards/scs/v2库来实现Http.Hijacker的方法。这种方法可以帮助开发者在自己的应

PHP小编苹果今天为大家介绍一种使用Gorilla websockets和alexedwards/scs/v2库来实现Http.Hijacker的方法。这种方法可以帮助开发者在自己的应用程序中实现实时通信的功能,无论是聊天室还是实时更新等场景,都可以通过这种方式实现。接下来,我们将详细讲解如何使用这两个库来实现http.Hijacker,让你的应用程序更加强大和灵活。

问题内容

最近将 Go WEB 应用程序中出色的 alexedwards/scs/v2 从 2.5.0 升级到 2.7.0,以允许 Go 1.20+ 支持 http.NewResponseController()。随后允许扩展处理程序特定的服务器写入超时以进行大文件上传。这很好。 此必要升级的一个不幸后果是 webSocket 功能的丢失,目前使用 Gorilla websockets v1.5.1(最新)。我在尝试连接升级时遇到常见错误... websocket:响应未实现 http.Hijacker 我已经为此研究了几个线索,其中一些是关于 SO 的,但我还无法解决任何特定于本案的问题。 我已经尝试了一些尝试与我的其他中间件代码一起并在我的 websocket 端点处理程序中实现 http.Hijacker (注释掉,附加“误导”示例以供说明)...我只是认为我对此理解得不够好。 ..

type WebsocketConnection struct {
    *websocket.Conn
}

type WebsocketPayload struct {
    Action      string              `JSON:"action"`
    Message     string              `json:"message"`
    AdminName   string              `json:"admin_name"`
    MessageType string              `json:"message_type"`
    AdminID     int                 `json:"admin_id"`
    Connection  WebsocketConnection `json:"-"`
}

type WebsocketJSONResponse struct {
    Action        string   `json:"action"`
    Message       string   `json:"message"`
    AdminName     string   `json:"admin_name"`
    AdminID       int      `json:"admin_id"`
    CurrentLogins []string `json:"current_logins"`
}

var upgradeConnection = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin:     func(r *http.Request) bool { return true },
}

var webClients = make(map[WebsocketConnection]string)

var websocketChannel = make(chan WebsocketPayload)

func (app *application) WebsocketEndPoint(w http.ResponseWriter, r *http.Request) {
    // rc := http.NewResponseController(w)
    // netConn, _, err := rc.Hijack()
    // if err != nil {
    //  app.errorLog.Println(err)
    //  return
    // }
    // defer netConn.Close()

    app.debugLog.Printf("w's type is %T\n", w)

    ws, err := upgradeConnection.Upgrade(w, r, nil)
    if err != nil {
        app.errorLog.Println(err)  <= ERROR HERE
        return
    }

    app.infoLog.Printf("Web client connected from %s", r.RemoteAddr)
    var response WebsocketJSONResponse
    response.Message = "Connected to server..."

    err = ws.WriteJSON(response)
    if err != nil {
        app.errorLog.Println(err)
        return
    }

    conn := WebsocketConnection{Conn: ws}
    webClients[conn] = ""

    go app.ListenForWebsocket(&conn)
}

本例中的“w”是*scs.sessionResponseWriter。 如何在响应中实现 http.Hijacker 而不破坏连接并进行升级?请问正确的做法是什么?

解决方法

alexedwards/scs/v2 软件包版本 2.5.0 支持劫持者接口。 2.7.0 版本不支持 Hijacker 接口,但支持 支持响应控制器。 gorilla websocket 包不使用响应控制器。

选项 1

使用 alexedwards/scs/v2 软件包的 2.5.0。

选项 2

通过在应用程序代码中解开响应编写器来解决 gorilla 包的缺陷:

func (app *application) WebsocketEndPoint(w http.ResponseWriter, r *http.Request) {

    wupgrade := w
    if u, ok := w.(interface{ Unwrap() http.ResponseWriter }); ok {
        wupgrade = u.Unwrap()
    }

    app.debugLog.Printf("w's type is %T\n", w)

    ws, err := upgradeConnection.Upgrade(wupgrade, r, nil)
    if err != nil {
        app.errorLog.Println(err)
        return
    }

    app.infoLog.Printf("Web client connected from %s", r.RemoteAddr)
    var response WebsocketJSONResponse
    response.Message = "Connected to server..."

    err = ws.WriteJSON(response)
    if err != nil {
        app.errorLog.Println(err)
        return
    }

    conn := WebsocketConnection{Conn: ws}
    webClients[conn] = ""

    go app.ListenForWebsocket(&conn)
}

以上就是如何使用 Gorilla Websockets 和 alexedwards/scs/v2 实现 http.Hijacker的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 如何使用 Gorilla Websockets 和 alexedwards/scs/v2 实现 http.Hijacker

本文链接: https://lsjlt.com/news/563110.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用 Gorilla Websockets 和 alexedwards/scs/v2 实现 http.Hijacker
    php小编苹果今天为大家介绍一种使用Gorilla Websockets和alexedwards/scs/v2库来实现http.Hijacker的方法。这种方法可以帮助开发者在自己的应...
    99+
    2024-02-10
  • 如何在 Golang 中使用 WebSockets 实现文件上传?
    在 golang 中使用 websockets 实现文件上传,需要引入 "github.com/gorilla/websocket" 包,设置 websocket 路由和处理函数。使用 ...
    99+
    2024-05-13
    golang git
  • 如何使用 KeyConditionExpression 和 v2 Go SDK 查询 AWS DynamoDb?
    问题内容 我在 dynamodb 中有一个使用以下命令创建的现有表 aws dynamodb create-table \ --region us-east-1 \ --tab...
    99+
    2024-02-08
  • 如何在Bokeh中使用回调和WebSockets实现服务器和客户端之间的实时通信
    在Bokeh中使用回调和WebSockets实现服务器和客户端之间的实时通信可以通过以下步骤完成: 创建一个Bokeh服务器应用...
    99+
    2024-05-21
    Bokeh
  • 如何实现HAProxy的安装和使用
    这篇文章主要为大家分析了如何实现HAProxy的安装和使用的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“如何实现HAProxy的安装和使用”的知识吧。HAP...
    99+
    2023-06-28
  • 如何使用Java和Git实现实时加载?
    在现代软件开发中,实时加载(Hot Reload)是一种非常重要的开发技术。通过实时加载技术,开发者可以在不重启应用程序的情况下进行代码修改和调试,从而提高开发效率和代码质量。在这篇文章中,我们将讨论如何使用Java和Git实现实时加载技...
    99+
    2023-09-21
    git 实时 load
  • 如何使用 Go 和 Shell 实现实时响应?
    随着现代应用程序的复杂性不断增加,实时响应已成为用户体验的一个重要组成部分。在实时响应方面,Go 和 Shell 都是非常优秀的编程语言。本篇文章将介绍如何使用 Go 和 Shell 实现实时响应。 一、Go 语言实现实时响应 Go 语言是...
    99+
    2023-08-09
    shell 响应 实时
  • 如何使用PHP和WebSocket实现实时通信
    随着互联网技术的不断发展,实时通信已经成为了日常生活中不可缺少的一部分。利用WebSockets技术可以实现高效、低延迟的实时通信,而PHP作为互联网领域使用最广泛的开发语言之一,也提供了相应的WebSocket支持。本文将为大家介绍如何使...
    99+
    2023-12-17
    PHP websocket 实时通信
  • 如何使用JavaScript和jQuery实现瀑布流
    这篇文章给大家分享的是有关如何使用JavaScript和jQuery实现瀑布流的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。用JavaScript实现基本结构:<div&n...
    99+
    2024-04-02
  • 如何使用JavaScriptCore实现OC和JS交互
    这篇文章主要介绍了如何使用JavaScriptCore实现OC和JS交互,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JavaScriptC...
    99+
    2024-04-02
  • JavaScript如何使用forEach遍历实现求和
    这篇文章主要为大家展示了“JavaScript如何使用forEach遍历实现求和”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript如何使用forEach遍历实现求和”这篇文章吧。...
    99+
    2023-06-17
  • JavaScript如何使用reduce方法实现求和
    这篇文章主要为大家展示了“JavaScript如何使用reduce方法实现求和”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript如何使用reduce方法实现求和”这篇文章吧。使用...
    99+
    2023-06-17
  • js如何使用for循环实现求和
    这篇文章主要介绍了js如何使用for循环实现求和,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用for循环,累加求和function sum(arr) ...
    99+
    2023-06-17
  • 如何使用容器化和Docker实现DevOps
    这篇文章主要介绍“如何使用容器化和Docker实现DevOps”,在日常操作中,相信很多人在如何使用容器化和Docker实现DevOps问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用容器化和Docke...
    99+
    2023-06-19
  • 如何使用Django和Bootstrap实现计算器
    小编给大家分享一下如何使用Django和Bootstrap实现计算器,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!准备工作创建一个应用添加应用到配置创建一个html编写视图函数from django.shortc...
    99+
    2023-06-25
  • 如何使用 Python 和 JavaScript 实现 Windows 同步?
    随着互联网的发展,人们越来越依赖云服务来存储和分享数据。但是,当我们需要在不同的设备之间同步数据时,我们可能会遇到一些问题。例如,我们可能需要在 Windows 操作系统和其他操作系统之间同步数据。在这种情况下,Python 和 JavaS...
    99+
    2023-09-09
    javascript windows 同步
  • 如何使用PHP和Swoole实现RPC远程调用
    如何使用PHP和Swoole实现RPC远程调用RPC(Remote Procedure Call)是一种远程调用的协议,可以让应用程序在不同计算机上进行函数调用。RPC通常被用于构建分布式系统,其可以让不同的微服务能够协同工作。在PHP和S...
    99+
    2023-05-14
    PHP rpc swoole
  • 如何使用HttpClient和HtmlParser实现简易爬虫
    这篇文章给大家分享的是有关如何使用HttpClient和HtmlParser实现简易爬虫的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。   HttpClient 简介   H...
    99+
    2024-04-02
  • 如何使用Java数组和链表实现栈
    小编给大家分享一下如何使用Java数组和链表实现栈,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、何为栈?栈(stack)又名堆栈,它是一种运算受限的线性表。限...
    99+
    2023-06-15
  • 编程算法:如何使用Java和Bash实现?
    随着计算机技术的不断发展,编程算法成为了计算机领域中的一项重要技能。在现代计算机领域中,编程算法已经成为了一个基础技能,因此熟练掌握编程算法对于计算机从业者来说是非常重要的。 本文将介绍如何使用Java和Bash实现编程算法。Java是一...
    99+
    2023-06-19
    教程 编程算法 bash
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作