我正在一个网站上,使用SSE(EventSource API)向客户广播一些事件。在移动版Chrome for Android上测试我的网站时,我注意到当频道闲置大约五分钟时,连接会丢失。
我使用了几个Android设备,不同的运营商和不同的浏览器,无论屏幕是打开还是关闭,结果都是一样的。桌面Chrome似乎可以使连接保持较长时间。
无法找到有关此问题的任何信息,在尝试调试问题时,我得到的只是在发送最后一个事件后大约3分半钟从电话IP地址收到的TCP“FIN”数据包。 / p>
EventSource的onerror
事件不会被触发,因此我无法知道连接何时被删除以启动新连接。
有没有办法避免这个问题,还是我应该每隔30秒发送一些假邮件以防止连接空闲?
提前致谢
答案 0 :(得分:0)
您可以设置retry
字段以建立EventSource
实例的reconnection time
如果字段名称为“重试”
- 如果字段值仅包含ASCII数字,则将字段值解释为十进制的整数,并设置事件流的 重新连接到该整数的时间。否则,请忽略该字段。
答案 1 :(得分:0)
您的连接可能是由“推送代理”建立的,该功能旨在提高手机的电池寿命。
引用来自“ https://html.spec.whatwg.org/multipage/server-sent-events.html”:
在受控环境中运行的用户代理,例如浏览器在 与特定运营商绑定的手机可能会减轻管理负担 与网络上代理的连接数。在这种情况下, 出于一致性目的的用户代理被认为包括 手机软件和网络代理。
例如,在移动设备上建立浏览器后, 连接,可能会检测到它在支持的网络上,并且 要求网络上的代理服务器接管服务器的管理 连接。这种情况的时间表可能如下:
- 浏览器连接到远程HTTP服务器,并在EventSource构造函数中请求作者指定的资源。
- 服务器偶尔发送消息。
- 在两条消息之间,浏览器检测到它处于空闲状态,除了保持TCP连接活动所涉及的网络活动之外, 并决定切换到睡眠模式以节省电量。
- 浏览器与服务器断开连接。
- 浏览器联系网络上的服务,并请求该服务(即“推送代理”)代替该连接。
- “推送代理”服务联系远程HTTP服务器,并请求作者在EventSource中指定的资源 构造函数(可能包含
Last-Event-ID
HTTP标头等)。- 浏览器允许移动设备进入睡眠状态。
- 服务器发送另一条消息。
- “推送代理”服务使用诸如OMA推送之类的技术将事件传达到移动设备,该事件仅足以唤醒 处理事件,然后返回睡眠状态。
这可以减少总数据使用量,从而导致 节省大量电量。