Javascript SSE(事件源)在1小时22分钟后超时。有没有办法保持它的持久性?

Javascript SSE(事件源)在1小时22分钟后超时。有没有办法保持它的持久性?,javascript,firebug,server-sent-events,Javascript,Firebug,Server Sent Events,我的页面中有一个区域,当数据库发生更改时,消息会在该区域显示。现在,有些日子数据库会发生很大变化,每10分钟就会显示一条新消息;其他日子,它只会改变几次。我遇到的问题是EventSource似乎在1小时22分钟后超时,浏览器将不再接收通知 我想知道是否有办法保持EventSources的持久性(即,只要浏览器显示页面,EventSource就处于活动状态)。根据我在谷歌搜索中发现的情况,EventSources应该保持活动状态,直到选项卡/窗口关闭。不幸的是,我在谷歌搜索中发现的似乎很少,对我来

我的页面中有一个区域,当数据库发生更改时,消息会在该区域显示。现在,有些日子数据库会发生很大变化,每10分钟就会显示一条新消息;其他日子,它只会改变几次。我遇到的问题是EventSource似乎在1小时22分钟后超时,浏览器将不再接收通知


我想知道是否有办法保持EventSources的持久性(即,只要浏览器显示页面,EventSource就处于活动状态)。根据我在谷歌搜索中发现的情况,EventSources应该保持活动状态,直到选项卡/窗口关闭。不幸的是,我在谷歌搜索中发现的似乎很少,对我来说,情况似乎并非如此。

你没有说套接字关闭发生在哪里(在浏览器上、客户端机器上的套接字、服务器端的套接字等等)但这并不重要,因为它们的修复方法都是一样的:发送保持活动状态的消息

服务器应发送保持活动状态消息。或者说每隔15秒;或者只在15秒不活动之后。(服务器端,哪一个更容易编码。)它可以像SSE注释一样简单::\n\n(以冒号开头的行被忽略)。我更喜欢发送实际数据,因为:

  • 您将看到一条消息,允许客户端保持活动状态检查(见下文)
  • 您肯定想发送一些有用的东西,比如时间戳(用于检查客户机/服务器时钟是否同步)或指标等
在客户端,运行一个计时器,将
setTimeout()
设置为20秒。每次从服务器接收任何数据(无论是真实数据还是保持活动状态)时,请关闭计时器,然后重新启动。因此,调用超时函数的唯一时间是服务器运行超过20秒而没有向您发送任何信息。发生这种情况时,请终止连接并重新连接

以上假设问题发生在套接字级别。问题可能是浏览器正在崩溃:可能是内存不足。在这种情况下,我要做的修复是一个每小时一次的计时器(
setTimeout()
,在JavaScript中),手动关闭并重新打开
EventSource
连接。或者清除一些可能正在使用的内存缓冲区。使用FireBug或Chrome工具进行一点评测将告诉您是否存在内存问题


插件:在我即将出版的SSE书中,“提高我们的应用程序生产质量”一章的一半以上是关于保持活力和在网络上使用LastId的。请在发布时购买:-)

我也有同样的问题,Chrome每两分钟报告一次“net::ERR\u SPDY\u PROTOCOL\u ERROR 200”

每分钟发送一次SSE评论为我解决了这个问题。请参见下面的示例Nodejs/Express代码

exports.addWebServices = function(app) {
  app.get('/ws/clientEvent', function(req, res) {
    res.writeHead(200, {
      'Content-Type': 'text/event-stream',
      'Cache-Control': 'no-cache',
      'Connection': 'keep-alive'
    })

    /* Event handlers for SSE here */

    let keepAliveMS = 60 * 1000;

    function keepAlive() {
      // SSE comment for keep alive. Chrome times out after two minutes.
      res.write(':\n\n');
      setTimeout(keepAlive, keepAliveMS);
    } 

    setTimeout(keepAlive, keepAliveMS);
  }

}

你能多分享一下那本书吗?名字,或者网页?我在哪里可以得到它,什么时候?@xeor O'Reilly,发布日期是2014年2月中旬。下周我应该知道关于标题(和封面动物)的最终决定。如果您想了解更多信息,请直接给我发电子邮件。为什么
setTimeout
而不是
setInterval
?@MikeM您每次获取数据时都会重新创建一次性计时器(您只希望在数据安静时触发它-正常使用时可能永远不会发生这种情况)。因此,触发之间的“间隔”非常不规则。