【问题标题】:Is it possible to temporarily disable a websockets connection in a local server environment?是否可以在本地服务器环境中临时禁用 websockets 连接?
【发布时间】:2015-06-18 10:28:21
【问题描述】:

我有一个使用 websockets (socket.io) 的 Node.js 脚本。该脚本在我的计算机上运行(例如本地服务器环境),我还通过计算机上的浏览器进行测试。我正在尝试优雅地处理断开连接和重新连接。到目前为止,我已经通过禁用/启用 iPad 上的 WiFi 来模拟网络干扰。 是否可以在我的本地计算机上禁用和恢复浏览器的 Web 套接字连接,即通过浏览器插件、第三方代理软件或其他工具?


我试过了:

  • Chrome 开发者工具:在其设备模式中有一个网络条件option,它允许我模拟各种网络连接。不幸的是 at this point in time 它仅适用于 HTTP 连接,不适用于 websocket 连接。
  • Charles: 它记录 websocket 连接,但不限制它们。 (我已将带宽、利用率和 MTU 设置为零,但仍会通过 websocket 连接接收响应)。
  • Fiddler:同样记录websocket连接,但不阻塞。

【问题讨论】:

  • 非常重要的问题。同样的问题。
  • 在 Firefox 中,您可以检查“脱机工作”,但我不能 100% 确定这适用于套接字。您也许还可以使用防火墙来阻止/取消阻止端口。

标签: javascript debugging websocket socket.io


【解决方案1】:

您可以尝试重载 WebSocket 对象。它有点脏,但是您可以捕获何时尝试创建 websocket 并创建延迟或其他任何东西。我还没有测试过,但它应该是健全的。 或者可能在发送或接收数据时重载 WS 方法本身以中断。

        var WebSocket2 = WebSocket;

        WebSocket = function(addy) {
            console.log('WS: Trying to open.');
            var ws;
            if (!this.blocked) {
                console.log('WS: Not blocked, allowing.');
                ws = new WebSocket2(addy);
                this.open_sockets.push(ws);
                return ws;
            } else {
                console.log('WS: Blocked.');
            }
        };

        WebSocket.toggle = function() {
            WebSocket.prototype.blocked = !WebSocket.prototype.blocked;
            var sockets = WebSocket.prototype.open_sockets;
            if (WebSocket.prototype.blocked) {
                console.log('WS: Blocking. Removing Old Sockets.');
                sockets.forEach(function(socket, index, sockets) {
                    console.log("WS: Closing -", index);
                    socket.close();
                });
                WebSocket.prototype.open_sockets = [];
                console.log("WS: Sockets left open -", WebSocket.prototype.open_sockets.length);
            } else {
                console.log("WS: Unblocking");
            }
        };

        WebSocket.prototype.open_sockets = [];
        WebSocket.prototype.blocked = false;

【讨论】:

  • 我刚刚编辑了一个小错误:Console.log() / console.log()。喜欢这个脚本,我使用它作为我的浏览器中自定义 websocket 地址阻止程序的基础,使用用户 javascript/greasemonkey 功能。
  • @Tyler 很高兴它很有用。绝对可以优化;这是一个快速而肮脏的例子。
  • 从头开始,我创建了一个 TamperMonkey/GreaseMonkey 脚本,它使这成为可能,并且托管在 greasyfork 上:greasyfork.org/en/scripts/421454-disable-websockets
【解决方案2】:

在看到上面@user3661841 的回答后,我创建了一个 GreaseMonkey/TamperMonkey 脚本,它允许您以类似的方式禁用 WebSockets。

以下是基于 Chromium 的浏览器(Chrome、Brave、Sidekick 等)的说明:

  1. 从 Chrome 商店下载 TamperMonkey extension
  2. 从 GreeasyFork 安装 this script。默认情况下,安装此脚本将在您访问的每个站点上禁用 WebSockets。如果您不想立即阻止 WebSocket,请单击 TamperMonkey 图标和切换开关以禁用阻止。
  3. 当您想要关闭 WebSockets 时,单击 TamperMonkey 图标和切换开关以启用阻止。刷新页面。
  4. 当您不想再阻止 WebSockets 时禁用脚本。

这是您要单击以禁用/启用 WebSocket 阻塞的开关:

注意 1:您应该能够在控制台中看到输出,表明 WebSocket 连接已尝试打开,但被阻止。

注意 2:确保在为开发禁用 WebSockets 后禁用此功能。如果你只使用 TamperMonkey 来禁用 WebSockets,你会希望你的 TamperMonkey 大多数时候看起来像这样:

当你想阻止时像这样:

【讨论】:

  • 这太棒了我能够在禁用 WS 时测试应用功能
【解决方案3】:

您可以使用简单的 tcp 代理,例如 tcp-proxy,然后关闭代理即可终止 WebSocket 连接。

【讨论】:

    【解决方案4】:

    使用特殊参数执行浏览器:

    chrome.exe --disable-web-sockets
    

    【讨论】:

    • 这似乎没有任何作用
    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2013-02-26
    • 2021-03-16
    相关资源
    最近更新 更多