ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

EventSource不会在Android Firefox上自动重新连接

2019-06-29 23:12:29  阅读:178  来源: 互联网

标签:android html5 firefox server-sent-events


我正在尝试实现一个可在桌面,Android和iOS上运行的HTML5应用程序.该应用程序的主要功能是向服务器无线发送有关要运行的脚本以及从该服务器推送有关这些脚本状态的常规消息的命令.

服务器正在运行nodejs,我决定使用Server Sent Events来执行推送通知.这要求我在Android上使用Firefox,因为原生Android浏览器不支持SSE.

我的实现一切正常:节点服务器正在发布事件,我的客户端HTML5 / javascript正在桌面chrome / firefox / safari,我的iPod iOS6和我的Android 2.2手机上正常运行.

但是,我需要处理4种常见情况:

>设备失去了Wi-Fi信号
> nodejs服务器崩溃(希望这不常见!)
>在浏览其他应用程序等时将浏览器置于iPod / Android的后台.
>在浏览器运行时锁定iPod / Android上的屏幕

Chrome / Safari在桌面和iPod上表现完美,如下所示:如果服务器崩溃,网站会在服务器再次启动时自动重新连接并获取推送的消息,如果浏览器应用程序因任何原因进入后台,它仍然在后台获取这些消息,或者至少在它返回前台时自动重新连接.

然而,桌面和Android上的Firefox都非常渴望永久关闭该EventSource连接.一旦浏览器失去与服务器的连接,无论是从服务器崩溃,将firefox应用程序放入后台还是锁定屏幕,EventSource连接都会被终止,并且不会尝试重新连接.当然,您可以在回到页面时重新加载页面,但这很烦人,特别是在您需要锁定屏幕的情况下,因为您需要将手机放入口袋(此应用程序需要用于一些徒步旅行的情况).

除了必须一直在Android Firefox中重新加载页面外,任何人都可以推荐任何解决方案吗?下面是我的虚拟实现,只需每5秒发送一次随机数.

服务器在/ main / src

src : function(req, res) {
req.socket.setTimeout(Infinity);    

// send headers for event-stream connection
res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive'
});
res.write('\n');

var messageCount = 0;
var process; 

function printEvent() {
    messageCount++; 
    rand = Math.floor((Math.random()*10000)+1);
    res.write('id: ' + messageCount + '\n');
    res.write("data: " + rand + '\n\n');        

    process = setTimeout(printEvent, 5000);
}
printEvent(); 

res.socket.on('close', function () {
    res.end();
    clearTimeout(process);
});
}

客户

var source = new EventSource('/main/src');

source.onopen = function(e){        
    $("#test").html("Connected to server. Waiting for data..."); 
} 

source.onmessage = function(e){  
    $("#test").html("MSG: " + e.data);
}

source.onerror = function(e){  
    var txt;
    switch(e.target.readyState){  
    case EventSource.CONNECTING:  
        txt = 'Reconnecting...';  
        break;  
    case EventSource.CLOSED:  
        txt = 'Connection failed. Will not retry.';  
        break;  
    }
    $("#test").html("Error: " + txt);
}

谢谢!!

解决方法:

我只知道一个已在许多库中使用的解决方案:
“心跳”消息 – 在客户端,您可以检查,如果在10秒内没有从服务器收到“随机数”(5000秒有些滞后) – 连接似乎被破坏,您应该重新连接
(使用本机EventSource,您可以使用“close”方法,而不是创建新的EventSource或者您可以尝试https://github.com/Yaffle/EventSource)

标签:android,html5,firefox,server-sent-events
来源: https://codeday.me/bug/20190629/1330728.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有