为什么websocket连接会在6到8分钟后自动关闭?

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

我们有一个内部使用聊天的应用程序。套接字对象是使用 url (https://myorgspace.com/myapp) 中的主机名创建的。代码如下:

function socketConnect(){
    var socketUrl = 'wss://'+location.hostname+'/web-socket';
    socket = new WebSocket(socketUrl);
    socket.onmessage = function(e){console.log("Socket connected");}
    socket.onclose = function(e){console.log("Web-Socket Connection closed.");}
}

问题是,6 到 8 分钟后,如果没有活动,网络套接字会自动关闭。现在接收者不会通过套接字接收任何消息。 但是,如果我通过私有 IP 连接到同一应用程序(例如:https://192.168.1.12/myapp),则套接字不会定期关闭。 任何人都可以帮忙吗?谢谢。

javascript sockets websocket connection
1个回答
0
投票

是因为浏览器的原因。 当页面在一段时间内(大约 5 分钟)处于非活动状态或不可见/未聚焦时,Chrome 或其他浏览器会进行某种“优化”。 之后,它限制页面与外部源的连接。

特别重要的是,您:

  • 关闭所有打开的 IndexedDB 连接。
  • 关闭打开的 BroadcastChannel 连接。
  • 关闭活动的 WebRTC 连接。
  • 停止任何网络轮询或关闭任何打开的 Web Socket 连接
  • 释放所有持有的网络锁。

您可以在此处找到更多详细信息:https://developer.chrome.com/docs/web-platform/page-lifecycle-api

解决方法:您可以创建每秒(或其他时间)触发的循环并创建与服务器的新连接

    const KEEP_ALIVE_INTERVAL = 1000;
    const keepConnectionAlive = () => {
        if (socketRef.current) {
            socketRef.current.start("KeepConnectionAlive");
            debug && console.log(`connected, connection ID=${socketRef?.current?.id ?? ""}`);
        }
    };

    const intervalId = setInterval(keepConnectionAlive, KEEP_ALIVE_INTERVAL);

PS:我很确定有更好的解决方案

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