重新连接 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 而不创建新实例 的相关文章

  • 如果我在不打算升级到 websocket 连接的 HTTP 请求中包含“Upgrade”和“Connection”标头,会发生什么情况?

    我有一个 Nginx 服务器块 用于代理对 node js 服务器的请求 该服务器同时提供 HTTP 内容和 WS websocket 内容 是否可以在不应升级到 Websocket 连接的请求上添加升级标头 即使用 Nginx 代理到服务
  • 使用 JavaScript 检测硬重新加载

    为了澄清 I am not试图区分刷新和重新加载 因此这不是重复的刷新与重新加载 https stackoverflow com questions 5004978 check if page gets reloaded or refres
  • 使用服务器发送事件进行双向客户端-服务器通信(而不是 WebSocket)的缺点

    最近 我发现服务器发送事件是 WebSocket 的一种更简单的替代方案 用于从服务器进行推送 大多数比较它们的地方 例如here https stackoverflow com questions 5195452 websockets v
  • Windows Phone 7 浏览器 - 单击链接时关闭灰色阴影

    使用 Windows Phone 7 浏览器 当用户单击链接时 该链接会显示一个灰色矩形阴影大约 0 5 秒 一般来说 这很好 但是 如果您有动态页面行为 例如 单击链接会更新 DOM 以便该链接不再可见 则在链接本身消失后 不透明的灰色矩
  • 使用PHP检测IE浏览器版本

    我正在使用 SERVER HTTP USER AGENT 来检测用户的浏览器 当我在 IE8 上的本地主机上运行 var dump 时 它返回 兼容的 微星8 0 但是当我将其上传到我的主机 godaddy 时 我得到 兼容的 MSIE 7
  • 如何获取默认的iOS浏览器名称?

    Stack Overflow 应用程序检测到我越狱设置的默认浏览器 Chrome 的名称 我怎样才能在 Objective C 和 Swift 中实现同样的目标 只是名称 不是 ActivityView 代码 Example Update
  • 如何为 Safari 浏览器设置媒体查询

    media only screen and min width 480px and max width 767px 这是我的媒体查询如何修复它 如何设置 safari 网络浏览器 媒体查询不是为了浏览器检测而进行的 使用 javascrip
  • Flask-SocketIO 未使用 Gevent/Gevent-websocket

    我正在使用 Flask 和 Flask SocketIO 构建用于 websocket 通信的 Web 界面 数据 API 我想开始转向使用 Gevent Gevent websocket Gunicorn 以及最终使用 Nginx 进行负
  • 使用 Flash 在本地托管游戏?

    我只是找不到合适的谷歌搜索词 是否可以使用 Flash 或 Flash 兼容服务 来允许游戏中的玩家通过 Web 浏览器托管自己的游戏 使用自己的带宽 在某种程度上 从他们的计算机运行他们自己的游戏服务器 对于 Flash 浏览器内游戏 但
  • 在 Apache 上设置 websocket?

    所以我正在对 websockets 进行一些研究 我有几个问题似乎找不到明确的答案 如何在 Linux 服务器上设置 Web 套接字 有 Apache 模块吗 我可以吗have使用第 3 方 PHP 代码或类似代码 除了浏览器兼容性之外 问
  • 为什么单击拖动手柄不会夺走文本焦点?

    我有一个带有一些文本的 divhttp jsfiddle net MuCeD 2 http jsfiddle net MuCeD 2 如果我双击 div 中的 sample 一词 它就会突出显示 如果我然后单击页面上的其他任何位置 文本就会
  • C# SignalR 异常 - 连接在收到调用结果之前开始重新连接

    我正在开发 2 个应用程序 第一个是 C 控制台应用程序 另一个是 Asp net Web 应用程序 我正在使用 SignalR 连接两者 这是我的 C 控制台应用程序 客户端 public class RoboHub public sta
  • 如何等待 WebSocket 就绪状态更改

    我正在尝试实现一个可以回退到轮询的 WebSocket 如果WebSocket连接成功 readyState变为1 但如果失败 readyState是 3 我应该开始轮询 我尝试过这样的事情 var socket new WebSocket
  • PC上同一浏览器的多个版本

    我的机器上运行的是 Windows 7 我安装了以下网络浏览器 Opera 谷歌浏览器 Safari Windows 版本 火狐3 6 IE 8 我正在本地 IIS Web 服务器上进行一些开发 需要跨浏览器测试我的 net Web 应用程
  • 在 Web 浏览器中禁用 F5 [重复]

    这个问题在这里已经有答案了 可能的重复 禁用浏览器的后退按钮 https stackoverflow com questions 961188 disable browsers back button 如何禁用浏览器上的 F5 刷新 htt
  • 严格/过渡 DOCTYPE 之间的浏览器渲染差异

    前段时间我遇到了一个 问题 但我从未深入了解过 希望有人能够照亮它 当我将 DOCTYPE 从严格更改为过渡时 是什么导致某些浏览器 Chrome Opera 和 Safari 以不同方式呈现页面 我知道造成这种情况的一般原因是触发了怪异模
  • 点击浏览器后退按钮时如何刷新 ASP .NET MVC 页面

    我刚刚发现 当我单击任何 ASP NET MVC 页面上的浏览器后退按钮时 没有任何反应 并且页面不会更新 并且只有当您单击 F5 时才会更新 主要问题是我对页面的 DOM 进行了一些更改 即添加表格行 选择单选按钮等 当我通过点击浏览器后
  • WebUSB API 和 PC/SC 智能卡读卡器

    是否在WebUSB API 起草的there https wicg github io webusb 能够使用 PC SC 设备 例如智能卡读卡器 或许假设它们符合 CCID 标准 许多设备接近这一标准并且可以使用通用驱动程序 如果是 是否
  • 如何使用 CSS 媒体查询检测设备方向?

    在 JavaScript 中 可以使用以下方式检测方向模式 if window innerHeight gt window innerWidth portrait true else portrait false 但是 有没有一种方法可以仅
  • 是否可以将请求标头添加到 CORS 预检请求中?

    我有一个从外部服务器 不是服务器 访问 API 的网站 为网站提供服务 通过简单的XmlHttpRequest 见下文 那个API 需要将用于访问服务的 API 密钥添加为请求标头 然而 正如这些CORS https developer m

随机推荐

  • 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 服务器 现在 节点服务器可以完成它需要的一切并且工作完美 我的问题是浏览器的实现 我查看了答案中其他人提供的许多库 但我想看看它们