是否可以暂时禁用本地服务器环境中的websockets连接?

时间:2015-06-18 10:28:22

标签: javascript debugging websocket socket.io

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

我尝试过这样的票价:

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

4 个答案:

答案 0 :(得分:5)

您可以尝试重载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;

答案 1 :(得分:2)

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

chrome.exe --disable-web-sockets

答案 2 :(得分:2)

您可以使用像tcp-proxy之类的简单tcp代理,只需关闭代理即可终止WebSocket连接。

答案 3 :(得分:1)

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

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

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

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

enter image description here

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

注意 2:当您为开发禁用 WebSockets 后,请务必禁用它。如果你只使用 TamperMonkey 来禁用 WebSockets,你会希望你的 TamperMonkey 在大多数情况下看起来像这样:

Tamper Monkey when not testing

当你想阻止时就像这样:

Tamper Monkey when testing