javascript - Android 上的 Chrome : connection become dead after 30 minutes

标签 javascript chat real-time long-polling server-sent-events

我们正在使用自己的通知系统构建一个聊天室,不依赖于 GCM,而是使用 Service Worker + SSE。 在桌面上没问题,但在移动 Android 应用程序上(使用 cordova-crosswalk,chromium 53)。 长时间运行的通知连接会在 20-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

最佳答案

我通常在 SSE 连接之上添加一个保持事件层。这种情况并不经常发生,但套接字可能会在没有正确终止的情况下终止,因此您的连接会变得安静,并且不会收到错误。

因此,一种方法是在获取数据函数中:

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

换句话说,如果距离上次获取数据已经超过 30 秒,请重新连接。根据发送数据的频率选择一个值:如果 10% 的时间数据事件之间有 60 秒的间隔,但从来没有 120 秒的间隔,则将超时设置为高于 120 秒是有意义的.

您可能还想通过将常规消息从服务器推送到客户端来保持事件。如果来自服务器的消息的频率非常不规则,那么这是一个好主意。例如。我可能会让服务器每 30 秒发送一次当前时间戳,并在客户端上使用 45 秒的保持事件超时。

顺便说一句,如果这是一个移动应用程序,请记住用户是否会欣赏减少接收聊天消息延迟的好处以及缩短电池生命周期的缺点。

关于javascript - Android 上的 Chrome : connection become dead after 30 minutes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43628495/

相关文章:

javascript - 如何使用 axios 和代理服务器进行 https 调用?

javascript - 使用 Javascript 与 SQL 服务器握手

php - 如何制作一个从 MySQL 读取用户名的聊天框?

real-time - 在线与实时

algorithm - 快速循环十进制数字进行打印(嵌入)

javascript - React-native TextInput 值接收对象,但我显然向它传递了一个字符串?

javascript - 是否可以使用 C++ 作为 Electron.js 的后端?

php - 用户对用户网络聊天应用程序 (PHP) - 什么选择?

java - 如何在 Android 应用程序中以编程方式创建 Telegram 贴纸

javascript - 构建实时网站的选项