我的页面中有一个区域,当数据库发生变化时,消息就会消失。现在,有些日子数据库会发生很大变化,每10分钟就会显示一条新消息。其他日子它只会改变几次。我遇到的问题是,EventSource似乎在1小时22分钟后超时,浏览器不再接收通知。
我想知道是否有办法使EventSources保持持久性(即,只要浏览器显示页面,EventSource仍然存在)。根据我在Google搜索中找到的内容,EventSources应保持活动状态,直到选项卡/窗口关闭。不幸的是,我在Google搜索中找到的内容似乎很少,对我而言似乎并非如此。
答案 0 :(得分:3)
您没有说套接字关闭发生在哪里(在浏览器上,客户端计算机上的套接字,服务器端的套接字等),但这并不重要,因为所有这些修复都是相同的:发送保持活跃的消息。
服务器应发送保持活动消息。每个,比方说,15秒;或仅在15秒不活动后。 (无论哪种更容易编码,服务器端,为您。)它可以像SSE注释一样简单:“:\ n \ n”(以冒号开头的行被忽略)。我更喜欢发送实际数据,因为:
在客户端,运行一个setTimeout()
设置为20秒的计时器。每次从服务器接收任何数据(无论是真实数据还是保持活动状态)时,请终止计时器,然后重新启动计时器。因此,只有当您的服务器超过20秒而没有向您发送任何内容时,才会调用超时功能。发生这种情况时,请终止连接并重新连接。
以上假设问题出在套接字级别。问题可能是浏览器崩溃:可能是内存不足。在这种情况下,我要做的修复是一次/小时计时器(JavaScript中为setTimeout()
),以手动关闭并重新打开EventSource
连接。或者清除一些可能正在使用的内存缓冲区。使用FireBug或Chrome工具进行一些分析会告诉您是否存在内存问题。
插件:我即将推出的SSE书中“使我们的应用程序生产质量”章节的一半以上是关于保持活力并在重新连接时使用LastId。请在购买时购买: - )
答案 1 :(得分:1)
Chrome浏览器每两分钟报告一次“ net :: ERR_SPDY_PROTOCOL_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);
}
}