Android上的Chrome浏览器:连接在30分钟后死机

问题描述:

我们正在使用自己的通知系统构建聊天室,而不依赖GCM,但需要服务人员+ SSE。 在桌面上它很好,但在移动android应用程序(它使用科尔多瓦人行横道,铬53)。 长时间运行的通知连接在20-30分钟后停滞,并处于前台活动状态。 它不会因为错误而死亡,只是不会收集数据。根本没有错误,这很奇怪。无法重新连接,因为我们不知道连接是否已经死亡。Android上的Chrome浏览器:连接在30分钟后死机

什么是最干净的方式?每5分钟重新启动连接是一个想法,但它不干净。 代码

runEvtSource(url, fn) { 
if (this.get('session.content.isAuthenticated') === true) { 
    var evtSource = new EventSource(url, { 
    withCredentials: true 
    }); 
}} 

侵略性重新连接代码

var evtSource = this.runEvtSource(url, fn) 
var evtSourceErrorHandler = (event) => { 
    var txt; 
    switch (event.target.readyState) { 
    case EventSource.CONNECTING: 
     txt = 'Reconnecting...'; 
     evtSource.onerror = evtSourceErrorHandler; 
     break; 
    case EventSource.CLOSED: 
     txt = 'Reinitializing...'; 
     evtSource = this.runEvtSource(url, fn) 
     evtSource.onerror = evtSourceErrorHandler; 
     break; 
    } 
    console.log(txt); 
evtSource.onerror = evtSourceErrorHandler 
+0

您是否定期尝试(小于您似乎遇到的超时)发送数据以保持连接活着? – gzost

+0

nope我还没有尝试过,这意味着发送假数据? –

+1

真的不是“假”数据,而是具有保持连接活动的唯一目的的数据(通常称为ping/pong)。 – gzost

我通常在所述SSE连接的顶部添加保活层。它不会经常发生,但套接字可能会死亡而不会正常死亡,因此您的连接会变得安静,并且不会出现错误。

因此,一种方式是,你获取数据函数中:

if(timer)clearTimeout(timer); 
timer = setTimeout(reconnect, 30 * 1000); 
...process the data 

换句话说,如果在30秒内,因为你最后得到的数据,重新连接。根据您发送的数据的频率选择一个值:如果10%的时间内数据事件之间存在60秒的间隔,但从未存在120秒的间隔,则将超时设置为高于120秒的值是有意义的。

您可能还想通过将常规消息从服务器推送到客户端来保持活动状态。如果来自服务器的消息频率非常不规则,这是一个好主意。例如。我可能会让服务器每30秒发送一次当前时间戳,并在客户端上使用45秒的保持活动超时时间。另外,如果这是一个移动应用程序,请记住,如果用户会意识到减少接收聊天消息延迟的好处,并减少电池寿命缩短的问题。

+0

当我检查,连接仍然活着,但数据只是不来或去。这是由于'插槽可以死在没有正常死亡'在铬为移动机器人?我想深入分析这一点。任何断开事件或错误事件由于重新尝试重新连接而重新连接。只是保持沉默而没有错误的连接。 –

+1

@PhyoArkarLwin是的,这就是问题的样子。例如。您的客户端和服务器之间的路由器之一决定放弃连接(在移动的情况下,可能仅仅是因为它已经打开很长时间),崩溃或重新启动。 –

+0

已更新侵略性重新连接代码。对于路由器断开代码修复的决定 - 当网络问题发生时,它会尝试重新连接,我已经用特定的ISP测试了一个特定的ISP,在2-3分钟后,它会断开长时间运行的连接,不管它是WebSocket还是任何其他的连接。 '在移动的情况下,也许只是因为它已经打开了很长时间'我猜这是真实的情况 –