WebSocket
通过本地环回接口与本地计算机上的应用程序进行通信。我能够打开套接字并在浏览器和应用程序之间发送消息。但是,连接将随机关闭,并显示 1001
状态代码,我无法识别任何模式或原因。
我一开始以为应用程序正在终止连接,但使用 Wireshark 进行更仔细的分析后,我发现浏览器正在终止连接(查看端口):
这个另一个线程表明从
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 连接?
Chrome 将关闭某些内容以节省内存,在这种情况下,套接字可以以状态 1001 关闭。我的此信息来源是
该页面提供:
修复:
为了避免这个问题,要么
要禁用 Chrome 功能,请在 Chrome URL 字段中输入“chrome://flags”,搜索“Throttle Javascript Timer”并禁用该功能。