移动电话

时间:2017-10-17 21:25:23

标签: javascript google-chrome server-sent-events server-push

我正在一个网站上,使用SSE(EventSource API)向客户广播一些事件。在移动版Chrome for Android上测试我的网站时,我注意到当频道闲置大约五分钟时,连接会丢失。

我使用了几个Android设备,不同的运营商和不同的浏览器,无论屏幕是打开还是关闭,结果都是一样的。桌面Chrome似乎可以使连接保持较长时间。

无法找到有关此问题的任何信息,在尝试调试问题时,我得到的只是在发送最后一个事件后大约3分半钟从电话IP地址收到的TCP“FIN”数据包。 / p>

EventSource的onerror事件不会被触发,因此我无法知道连接何时被删除以启动新连接。

有没有办法避免这个问题,还是我应该每隔30秒发送一些假邮件以防止连接空闲?

提前致谢

2 个答案:

答案 0 :(得分:0)

您可以设置retry字段以建立EventSource实例的reconnection time

  
      
  • 如果字段名称为“重试”

         
        
    • 如果字段值仅包含ASCII数字,则将字段值解释为十进制的整数,并设置事件流的   重新连接到该整数的时间。否则,请忽略该字段。
    •   
  •   

答案 1 :(得分:0)

您的连接可能是由“推送代理”建立的,该功能旨在提高手机的电池寿命。

引用来自“ https://html.spec.whatwg.org/multipage/server-sent-events.html”:

在受控环境中运行的用户代理,例如浏览器在 与特定运营商绑定的手机可能会减轻管理负担 与网络上代理的连接数。在这种情况下, 出于一致性目的的用户代理被认为包括 手机软件和网络代理。

例如,在移动设备上建立浏览器后, 连接,可能会检测到它在支持的网络上,并且 要求网络上的代理服务器接管服务器的管理 连接。这种情况的时间表可能如下:

  1. 浏览器连接到远程HTTP服务器,并在EventSource构造函数中请求作者指定的资源。
  2. 服务器偶尔发送消息。
  3. 在两条消息之间,浏览器检测到它处于空闲状态,除了保持TCP连接活动所涉及的网络活动之外, 并决定切换到睡眠模式以节省电量。
  4. 浏览器与服务器断开连接。
  5. 浏览器联系网络上的服务,并请求该服务(即“推送代理”)代替该连接。
  6. “推送代理”服务联系远程HTTP服务器,并请求作者在EventSource中指定的资源 构造函数(可能包含Last-Event-ID HTTP标头等)。
  7. 浏览器允许移动设备进入睡眠状态。
  8. 服务器发送另一条消息。
  9. “推送代理”服务使用诸如OMA推送之类的技术将事件传达到移动设备,该事件仅足以唤醒 处理事件,然后返回睡眠状态。

这可以减少总数据使用量,从而导致 节省大量电量。