Fra*_*fka 8 javascript firebug server-sent-events
我的页面中有一个区域,当数据库发生更改时,消息会发送到该区域。现在,有时数据库会发生很大变化,以至于每 10 分钟就会显示一条新消息;其他日子它只会改变几次。我遇到的问题是 EventSource 似乎在 1 小时 22 分钟后超时,浏览器将不再收到通知。
我想知道是否有办法保持 EventSources 持久(即,只要浏览器显示页面,EventSource 是活动的)。根据我在 Google 搜索中发现的内容,EventSources 应该保持活动状态,直到选项卡/窗口关闭。不幸的是,我在 Google 搜索中找到的东西似乎很少,而对我而言,情况似乎并非如此。
Dar*_*ook 12
您没有说明套接字关闭发生的位置(在浏览器上、客户端计算机上的套接字、服务器端的套接字等),但这并不重要,因为修复对所有这些都是相同的:发送保持- 活着的消息。
服务器应该发送一个保持活动的消息。或者说,每 15 秒;或仅在 15 秒不活动后。(对于您来说,服务器端更容易编码。)它可以像 SSE 注释一样简单:“:\n\n”(以冒号开头的行被忽略)。我更喜欢发送实际数据,因为:
在客户端,运行一个setTimeout()设置为 20 秒的计时器。每次你从服务器收到任何数据(无论是真实数据,还是你的keep-alive),杀死定时器,重新启动。因此,超时函数将被调用的唯一时间是您的服务器超过 20 秒没有向您发送任何内容。发生这种情况时,终止连接并重新连接。
以上假设问题出在套接字级别。问题可能是浏览器崩溃了:可能是内存不足。在这种情况下,我要做的修复是一个每小时一次的计时器(setTimeout()在 JavaScript 中),以手动关闭并重新打开EventSource连接。或者清除一些您可能正在使用的内存缓冲区。使用 FireBug 或 Chrome 工具进行一些分析会告诉您是否有内存问题。
Plug:在我即将出版的 SSE 书中,超过一半的“使我们的应用程序生产质量”一章是关于保持活动状态和在重新连接时使用 LastId。出来后请购买:-)
我在 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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5153 次 |
| 最近记录: |