重新连接 WebSocket 而不创建新实例

2024-03-07

因此,我创建了一个新的 Web 应用程序,它使用 WebSocket 到 Node.JS WebSocket 服务器。现在,节点服务器可以完成它需要的一切并且工作完美。我的问题是浏览器的实现。

我查看了答案中其他人提供的许多库,但我想看看它们是否是更好或更干净的方法来做到这一点。

因此,在我的实例中,我本质上创建了一个对象,该对象包装了 WebSocket,然后通过调用 connect(url),这将创建另一个 WebSocket 实例。

我一直在研究连接和客户端,似乎如果一个连接关闭,比如服务器宕机,或者发生了一些事情,那么有时,在较长的一段时间内,WebSocket 连接会加倍,所以相反每个客户端有 1 个连接,是 2、3 还是 4...?

我有一种感觉,这是因为我每次都创建一个新的 WebSocket 实例?

代码如下:

// Main Function
function WSWrapper() {

    // Variables
    this.socket = null;
    this.enabled = false;
    this.retry = false;

    // Connect
    this.connect = function(address) {

        // Sets the address
        this.address = address;

        // Creates the websocket connection
        this.socket = new WebSocket(address);

        // On message event handler
        this.socket.onmessage = function(event) {

            // Do stuff here

        }

        this.socket.onopen = function(event) {

            // On connect, disable retry system
            window.ta.enabled = true;
            window.ta.retry = false;

        }

        this.socket.onclose = function(event) {

            // On close, enable retry system, disable bidding
            window.ta.enabled = false;
            window.ta.retry = true;
            window.ta.bidEnabled = false;

        }

        this.socket.onerror = function(event) {

            // Set variables off
            window.ta.enabled = false;
            window.ta.bidEnabled = false;
            window.ta.retry = true;

        }

        return true;
    }


    // Close Socket
    this.closeSocket = function() {

        // Shutdown websocket
        this.socket.close();
        return true;

    }

    // Send Message
    this.socketSend = function(content) {
        this.socket.send(content);
        return true;
    }

    // Retry System: Attempts to reconnect when a connection is dropped
    this.repeat = setInterval(function() {
        if (window.ta.enabled == false && window.ta.retry == true) {
            window.ta.connect(window.ta.address);
        }

    }, 2000);

}

window.ta = new WSWrapper();
window.ta.connect('wss://example.com');

我提出了一些想法和问题,任何答案都会很好。

  1. 有没有办法重新连接同一个套接字?就像 .open(url) 函数将重新打开连接?我查看了 chrome 控制台,浏览了 WebSocket 的原型,但我在那里什么也没看到,所以我不这么认为,但很想知道其他情况。

  2. 我可以通过使用一些获取信息的函数来解决这个问题,例如,我创建 WebSocket 实例,然后将所有请求传递给另一个函数来管理消息信息,然后当连接断开时,我可以somehow删除旧实例并重新创建一个新实例?

任何事情都会很好,因为我真的不确定,似乎每个人都会制作一个包装器(就像我正在做的那样),但做事的方式不同,所以什么是最好的方法或首选方法,这不会导致多个实例套接字继续运行?如果我的代码有问题,请解释!

Thanks


只是对此的更新,我能够采用以下代码:https://github.com/websockets/ws/wiki/Websocket-client-implementation-for-auto-reconnect https://github.com/websockets/ws/wiki/Websocket-client-implementation-for-auto-reconnect

并修改它以在浏览器中为我工作。请参阅下面的代码,请记住这是上述代码的改编,因此我不相信代码。

// Define WSClient instance
window.WSClient = {

    // Default reconnect interval
    reconnectInterval: 5000,

    // Define whether it has ever reconnected
    reconnected: false,

    // Log messages
    debug: false,

    // Open the URL
    open: function(url) {

        // Define that
        var that = this;

        // Open the URL
        this.url = url;

        // Create underlying websocket instance
        this.instance = new WebSocket(this.url);

        // Setup the event handler for onopen
        this.instance.onopen = function (ev) {

            // If it has ever reconnected lets say that
            if (that.reconnected && that.debug) {
                console.log('[WS]: Reconnected.');
            }

            // Run the open function
            that.onopen(ev);
        }

        // Setup the event handler for onmessage
        this.instance.onmessage = function(data, flags) {
            that.onmessage(data, flags);
        }

        // Setup the event handler for onclose
        this.instance.onclose = function(e) {
            switch (e){

                // Normal closure
                case 1000:
                    if (that.debug) {
                        console.log("[WS]: Closed");
                    }
                    break;

                // Abnormal closure
                default:
                    that.reconnect(e);
                    break;
            }

            // Run onclose event
            that.onclose(e);
        }

        // Setup the event handler for onerror
        this.instance.onerror = function(e) {
            switch (e.code){

                // Try and reconnect
                case 'ECONNREFUSED':
                    that.reconnect(e);
                    break;

                // Otherwise run error
                default:
                    that.onerror(e);
                    break;
            }
        }
    },

    // Setup send function
    sendRaw: function(data, option) {
        try {
            this.instance.send(data, option);
        } catch (e) {
            this.instance.emit('error', e);
        }
    },

    // Send the content
    send: function(content) {
        this.instance.send(content);
    },

    // Define the reconnection function
    reconnect: function(e) {

        // Define that
        var that = this;

        // Log reconnection
        if (that.debug) {
            console.log(`[WS]: Reconnecting in ${this.reconnectInterval / 1000} seconds.`);
        }

        // Set reconnect timeout
        setTimeout(function() {

            // Log reconnecting
            if (that.debug) {
                console.log("[WS]: Reconnecting...");
            }

            // Define has reconnected
            that.reconnected = true;

            // Try and open the URL
            that.open(that.url);

        }, this.reconnectInterval);
    },
}

所以我在 Vue.JS 框架中使用它,如下所示:

<script type="text/javascript">

    // Define the websocket
    window.vm['socket_example'] = new Vue({
        el: '#socket_example',
        name: 'SocketExample',
        data: {},
        methods: {

            // On connection open
            socket_open: function(event) {

                // Send get lots function
                this.$socket.send('some_content_here');

            },

            // On connection close
            socket_close: function(event) {

            },

            // On connection error
            socket_error: function(error) {

            },

            // On connection message
            socket_message: function(event) {

            },

        },

        mounted: function() {

            // Setup WebSocket connection
            this.$socket = WSClient;
            this.$socket.debug = true;
            this.$socket.open('<?php echo $endpoint; ?>');

            // Setup websocket listeners
            this.$socket.onopen = this.socket_open;
            this.$socket.onclose = this.socket_close;
            this.$socket.onerror = this.socket_error;
            this.$socket.onmessage = this.socket_message;

        },
    });
</script>

无论如何,我希望这有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重新连接 WebSocket 而不创建新实例 的相关文章

  • 如何监控浏览器中发出的所有自定义事件?

    我想监视网络浏览器中触发的所有自定义事件 任何标准浏览器都可以 需要明确的是 我知道您可以附加事件处理程序来查看何时触发 通常 事件 但如何可靠地检测嵌入对象或 jQuery 脚本是否触发自定义事件 我可以重构浏览器源代码来挂钩事件循环 但
  • 防止 NGINX 中的一个 WebSocket 连接泛滥?

    我使用这个配置来防止我的服务器上出现类似 DOS 的洪水 limit req zone binary remote addr zone one 10m rate 10r s limit req zone binary remote addr
  • 关闭 选择文件对话框和 onchange 事件之间存在大量延迟。浏览器有点冻结

    有时我会遇到浏览器本机选择文件对话框的非常奇怪的行为 我有一个
  • 通过 ServletContextListener 中的 SimpMessagingTemplate 向所有客户端发送消息

    我正在使用 Spring 框架 并且有一个工作的 websocket 控制器 如下所示 Controller public class GreetingController MessageMapping hello SendTo topic
  • 如何在 Javascript 中打开新标签?

    我想在新选项卡中打开我网站的页面 我尝试使用 window open 函数 但似乎不再支持它 这些是我在本地尝试过的一些选项 url localhost 3000 my other page window open url blank OR
  • Kubernetes 集群中的 Websocket 连接与 nginx-ingress

    我正在尝试在 Kubernetes 集群中运行的服务器上建立一个简单的 Websocket 连接 Websocket 连接能够在我的本地测试计算机上建立 但在使用 nginx ingress 部署到 GKE 后 我无法将客户端连接到服务器
  • Web 浏览器中的高品质音频录制

    一行版本 什么开源软件 WAMI Recorder 网络浏览器 通过 getUserMedia 将为我提供最佳质量的录音 高质量定义为 44 1 或 48 采样率 和 16 位样本大小 更多信息 目前我的解决方案是 WAMI Recorde
  • 通过“查看源代码”显示的 HTML 与 (Firebug) 开发人员工具中显示的 HTML 是否不同?

    我将 Firefox 与 Firebug Developer 工具一起使用 查看源代码中是否显示 HTML Ctrl U 与我使用 Firebug 检查元素时看到的 HTML 不同吗 两者有何区别 是的 他们是不同的 查看源代码显示页面的原
  • C 代码中的握手 WebSocket

    我是 html5 及其 websocket 的新手 现在我一直在尝试用 c 制作自己的 websocket 服务器但是 这对我来说很难 我只想从 C 服务器发送 hello world 到 html 客户端 但是 我在握手方面遇到了麻烦 o
  • Android:直接从浏览器下载文件

    我试图让 Android 浏览器下载特定类型 xxx 的文件 这样我就可以设置一个应用程序与其关联 我已经成功完成了关联部分 因为我已经做到了 以便在资源管理器应用程序中单击正确类型的文件会加载适当的应用程序 我希望这会转移到浏览器 这样如
  • 使用代码中的 URL 启动 Microsoft Edge

    我需要从 C 应用程序使用特定 URL 启动 Microsoft Edge 浏览器 我怎样才能做到这一点 检索 Microsoft Edge 安装路径并通过适当的参数调用它的最佳方法是什么 我想直接启动它而不安装任何网络驱动程序 我看到了这
  • 在浏览器中刷新页面而不重新提交表单

    我是一名 ASP NET 开发人员 我通常会发现自己正在浏览器中打开正在处理的网页 Chrome 是我选择的浏览器 但这个问题与任何浏览器都相关 我的工作流程通常是这样的 编写代码 在 Visual Studio 中重建项目 然后使用 Al
  • 如何检测 Facebook 应用内浏览器?

    您有过 Facebook 应用内浏览器检测的经验吗 用户代理的核心区别是什么 我不想知道它是否是唯一的移动 ios chrome 我需要知道用户代理是否特定于Facebook 应用内浏览器 您可以在用户代理中检查 FBAN FBAV 检查此
  • WebSocket如何压缩消息?

    JSON stringify 显然空间利用率不高 例如 123456789 123456789 占用 20 多个字节 而它可能只需要大约 5 个字节 websocket 在发送到流之前是否会压缩其 JSON WebSocket 的核心只是一
  • 如何使用 Web 套接字和 Angular CLI 设置代理

    我有一个使用 Angular CLI 构建的简单 Web 应用程序 我希望它使用网络套接字与后端通信 我已经编写了后端 并使用一个简单的 index html 页面进行了测试 服务器可以在套接字上发送和接收该页面 在我的 angular c
  • 如何销毁角度工厂实例

    一方面 我有几个工厂 每个工厂都控制一个 websocket 另一方面 其中一个工厂应该在客户端登录时启动 因此 if user isLogged injector get NotificationsWebsocket 这就是我动态初始化工
  • 设置 cookie 时中断 JavaScript 执行

    当设置 cookie 时 是否可以始终中断浏览器开发人员工具中的 javascript 执行 无需显式设置 JS 断点 document cookie 在 html head 块的开头添加此代码片段效果很好
  • 如果禁用 JavaScript,我的 Web 应用程序会发生什么情况?

    我正在学习 jQuery 并准备使用该库来编写一些页面 我刚刚了解到一些用户在他们的浏览器上禁用了 JavaScript 我什至不知道这是可能的和 或必要的 现在 我的问题是 如果用户禁用 JavaScript 我的 Web 应用程序会发生
  • Socket.io v3 不支持的协议版本错误

    我坚持使用较新版本的 socket io 一切都很好 但是当我想升级到 socket io 3 时 一切都崩溃了 目前在客户端上 我收到一个 400 HTTP 状态代码 并带有以下 JSON 响应 code 5 message Unsupp
  • 如何清除浏览器的缓存?

    当我在 Facebook 上玩应用程序且游戏未加载时 会出现提示 要求清除浏览器缓存 如何清除浏览器的缓存 似乎还没有人提到这一点 所以我想我应该插话一下 当你在 Chrome 中打开页面检查器时 你可以右键单击重新加载页面图标将与菜单一起

随机推荐

  • Java:锁定线程时,AtomicBoolean 和静态布尔变量有什么不同?

    我写了一个名为T的线程类 我的目的是确保一次只有一个线程对象运行 因此 当调用线程对象时 它会检查一个名为 BUSY 的布尔标志 我的问题是两者有什么不同 private static AtomicBoolean BUSY new Atom
  • R - ggplot2 geom_area 只有一个类别可见?

    R 新手 stackoverflow 新手 所以请原谅我 我正在尝试使用 ggplot2 在 R 中绘制时间序列图 我想显示两个折线图 它们的填充值低于给定日期的值 我一直在尝试使用 geom area position identity
  • 复制数组上的 Javascript .map()

    我注意到调用 map 而不将其分配给变量会使其返回整个数组 而不仅仅是更改的属性 const employees name John Doe age 41 occupation NYPD killCount 32 name Sarah Sm
  • 视频不再在 Chrome 中使用 mediaelement.js 进行流式传输

    在过去的几天里 我们注意到我们的视频停止使用MediaElement js Version 2 11 3 and Chrome Version 50 0 2661 94 64 bit 视频仍然可以在 Firefox 和 Safari 中正常
  • 如何解决有关 Sitecore 培训网站的登录/数据库丢失错误?

    我在访问 Sitecore 培训网站时收到以下错误 应用程序中的服务器错误 无法打开登录请求的数据库 SiteCoreTrainingSitecore Core 登录失败 用户 sitecore 登录失败 描述 执行当前 Web 请求期间发
  • Matplotlib 用线条和图形注释条形图的方法[重复]

    这个问题在这里已经有答案了 我想为条形图创建注释 将条形图的值与两个参考值进行比较 如图所示的叠加 一种工作人员仪表 是可能的 但我愿意接受更优雅的解决方案 条形图是用以下命令生成的pandas API to matplotlib e g
  • 在文件流中向后退一位

    假设我有一个像这样的文件指针 file ptr fopen test txt r 我想改变每一个char当我在流中移动时的 ASCII 值 我将其作为密码执行 因此如果有更好或更有效的方法来执行此操作 请告诉我 我正在尝试使用while f
  • 快速、objective-c 协议实施

    仍在尝试习惯swift 但由于我的obj c知识接近0 所以我一直无法实现这个SocketRocket协议 任何帮助将不胜感激 这是我尝试实现的 obj c 委托 protocol SRWebSocketDelegate
  • yylineno 在 yacc 文件中始终具有相同的值[重复]

    这个问题在这里已经有答案了 对于编译器中的一个项目 我在语法分析器中遇到一个问题 当我在符号表中添加符号时 我在 yylineno 中始终采用相同的值 我一开始就是这样做的 int yylex void int yyerror char y
  • 从 C、GCC(裸机)调用 ARM 汇编

    我正在尝试使用 GCC 在 ARM 中进行一些裸机编程并在 QEMU 上进行测试 每当我从 C 调用 ARM 标签时 我的程序就会挂起 我有一个简单的代码示例 显示了问题https gist github com 1654392 https
  • “这个”级联是如何工作的?

    我有以下类接口 class Time public Time int 0 int 0 int 0 Time setHour int Time setMinute int Time setSecond int private int hour
  • 使用 connect 时出错(react-redux 库的函数)

    我有一个组件类 我正在使用react redux来连接redux存储 但是当我尝试将组件传递到connect函数时出现错误 react default memo 不是一个函数 在 react default memo ConnectFunc
  • CGO:如何在 Golang 中使用指针访问 C 数组中的数据

    我正在使用 FFmpeg 为 Windows 平台编写一个应用程序 它是 golang 包装器 goav 但我无法理解如何使用 C 指针来访问它们指向的数据数组 我试图获取存储在 AVFrame 类中的数据 并使用 Go 将其写入文件 最终
  • 相关非类型模板参数

    考虑下面的类 class Foo enum Flags Bar Baz Bax template
  • 如何在 Java 中配置数据源以连接到 MS SQL Server?

    我正在尝试按照 Java 的 JDBC 教程编写一个可以连接到 SQL Server 2008 的 Java 程序 在建立连接时我迷失了方向 以下片段来自教程 InitialContext ic new InitialContext Dat
  • 如何在 Windows Azure 中连接 2 个虚拟机以实现两层架构?

    如何在 Windows Azure 中创建 2 个连接的虚拟机以便能够部署两层架构解决方案 让我澄清一下这个场景 目前我在 Windows Azure 中使用 1 个虚拟机 其中安装了 SQL Server 2008 DB 和 ASP NE
  • 何时使用动态库与静态库

    在 C 中创建类库时 可以选择动态 dll so 和静态 lib a 图书馆 它们之间有什么区别 什么时候适合使用哪个 静态库会增加二进制文件中代码的大小 它们总是被加载 并且无论您编译的代码版本是什么 都是将运行的代码版本 动态库单独存储
  • 如何从 silverlight 应用程序检测操作系统?

    我有一个 Silverlight3 应用程序 旨在在 Windows 和 Mac OS 环境上运行 我想在运行时知道我的应用程序是在 Windows 还是 Mac 上运行 这样我就可以根据用户在他们选择的操作系统中习惯的方式进行一些调整 例
  • 在 CodeIgniter 2.0 中返回并使用数据库中的多维记录数组

    大家好 好吧 我正在尝试使用 codeigniter 但在我看来 我在尝试检索和显示表中的数据时造成了一些混乱 这是代码片段 我想检索存储在我的文章表中的所有文章 同时我需要从关系表和分别名为articleTagRelation和标签的标签
  • 重新连接 WebSocket 而不创建新实例

    因此 我创建了一个新的 Web 应用程序 它使用 WebSocket 到 Node JS WebSocket 服务器 现在 节点服务器可以完成它需要的一切并且工作完美 我的问题是浏览器的实现 我查看了答案中其他人提供的许多库 但我想看看它们