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

问题描述 投票:0回答:5

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


所以我尝试过:

  • Chrome开发者工具:在其设备模式中有一个网络条件选项,它允许我模拟各种网络连接。不幸的是,此时它仅适用于 HTTP 连接,不适用于 Websocket 连接。
  • Charles 它记录 websocket 连接,但不会限制它们。 (我已将带宽、利用率和 MTU 设置为零,但仍然通过 Websocket 连接接收响应)。
  • Fiddler同样记录websocket连接,但不阻止它们。
javascript debugging websocket socket.io
5个回答
6
投票

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

4
投票

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

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

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

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

注意 2:当您完成禁用 WebSocket 进行开发时,请确保禁用此功能。如果您只使用 TamperMonkey 来禁用 WebSocket,您会希望 TamperMonkey 大多数时候看起来像这样:

当你想阻止时,像这样:


2
投票
您可以使用简单的 tcp 代理,例如

tcp-proxy,只需关闭代理即可终止 WebSocket 连接。


0
投票
当您可以轻松地在请求标头中动态捕获 websockets 时,劫持 webSocket 原型并不是最好的解决方案。

捕获并提示传入 Websocket 的用户...

chrome.webRequest.onBeforeRequest.addListener(function(details){ let Block=false; if(details.type=='websocket'){ let S='This site is attempting to establish a websocket connection with you!\n\n'+ 'Site: '+details.initiator+'\n\n'+ 'Socket: '+details.url+'\n\n'+ 'Do you want to allow this?'; Block=!confirm(S); } } return{cancel:Block};},{urls:['<all_urls>']},['blocking']);
默默地彻底阻止网络套接字...

chrome.webRequest.onBeforeRequest.addListener(function(details){ let Block=false; if(details.type=='websocket'){Block=true;} } return{cancel:Block};},{urls:['<all_urls>']},['blocking']);
2024年使用的测试地点:

https://tass.com/ https://soccer365.me/online/
    

-2
投票
使用特殊参数执行浏览器:

chrome.exe --disable-web-sockets
    
© www.soinside.com 2019 - 2024. All rights reserved.