什么原因导致 WebSocket 在 Chrome 中关闭?

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

我正在开发一个 Chrome 扩展,它使用

WebSocket
通过本地环回接口与本地计算机上的应用程序进行通信。我能够打开套接字并在浏览器和应用程序之间发送消息。但是,连接将随机关闭,并显示
1001
状态代码,我无法识别任何模式或原因。

我一开始以为应用程序正在终止连接,但使用 Wireshark 进行更仔细的分析后,我发现浏览器正在终止连接(查看端口):

Wireshark capture

这个另一个线程表明从

true
返回
message
甚至会终止连接,所以我向我的事件处理程序添加了
return false
(这什么也没做)。为了获得更多见解,我还为
open
/
close
/
error
事件设置了一些日志记录/通知,但只有
open
事件会触发(打印
{ "isTrusted": true }
):

async function createWebSocket(settings: Settings, tabId: number) {
    const url = generateUrl(settings, 'ws');
    const webSocket: WebSocket = new WebSocket(url);
    const context: SessionContext = { tabId, webSocket, settings };
    TAB_SESSIONS[tabId] = context;

    webSocket.addEventListener('message', (event) => {
        console.log(event);
        return false;
    });


    const notify = (id: string, event: any) => {
        chrome.notifications.create(
            id,
            {
                type: "basic",
                iconUrl: "notif.png",
                title: 'WebSocket Event',
                message: JSON.stringify(event)
            }
        );
    };

    webSocket.addEventListener('open', (event) => notify('sockopen', event));
    webSocket.addEventListener('close', (event) => notify('sockclose', event));
    webSocket.addEventListener('error', (event) => notify('sockerr', event));
}

鉴于我的扩展代码中没有对

WebSocket#close
的调用,浏览器必须自主操作以关闭连接 - 还值得注意的是,Chrome 不允许将
1001
传递给
WebSocket.close()
,这是规则排除任何 JavaScript 直接关闭连接的可能性。我怀疑发生了某种事件或某些安全策略正在终止连接,但我没有任何证据支持这种怀疑。

这引出了我真正的问题。哪些事件或场景会导致 Chrome 关闭 WebSocket 连接?

google-chrome google-chrome-extension websocket
1个回答
0
投票

Chrome 将关闭某些内容以节省内存,在这种情况下,套接字可以以状态 1001 关闭。我的此信息来源是

https://solace.community/discussion/694/client-websocket-disconnects-when-browser-is-minimized-or-not-in-focus-chrome

该页面提供:

修复:

为了避免这个问题,要么

  1. 禁用 Chrome 中的“密集节流 Javascript 计时器唤醒”功能,或者,
  2. 将客户端配置文件中的 Web 传输非活动超时更改为 60 秒以上。

要禁用 Chrome 功能,请在 Chrome URL 字段中输入“chrome://flags”,搜索“Throttle Javascript Timer”并禁用该功能。

© www.soinside.com 2019 - 2024. All rights reserved.