Tag: 服务器发送事件

如何在客户端浏览器退出时终止node.js服务器连接?

我试图写一个简单的node.js服务器与服务器发送事件能力没有socket.io。 我的代码运行得不错,但是当我testing它时遇到了一个很大的问题。 如果我从浏览器连接到node.js服务器,它将会收到服务器事件的罚款。 但是当我刷新连接时,相同的浏览器将开始接收事件两次。 如果我刷新n次,浏览器将接收数据n + 1次。 我试过的最多的是16次(16次刷新),之后我就不再去计算了。 从我的浏览器看到下面的控制台截图。 刷新后(试图进行AJAX调用),会输出“SSE长连接build立! 之后它将开始接收事件。 注意事件到达的时间。 我在19:34:07得到了两次事件(它在事件接收和数据写入屏幕上两次logging到控制台,所以你可以在那里看到四个日志)。 我也在19:34:12两次得到事件。 在客户端closures连接(使用source.close())之后,在服务器端看起来如此: 正如你所看到的,它仍然试图发送消息给客户端! 此外,它试图发送消息两次(所以我知道这是一个服务器端问题)! 我知道它试图发送两次,因为它发送了两个心跳,当它只发送一次每30秒。 此问题在打开n个选项卡时会放大。 每个打开的标签将会收到n * n个事件。 基本上,我如何解读它是这样的: 打开第一个标签,我订阅服务器一次。 打开第二个标签,我再次订阅两个打开的标签到服务器 – 所以这是每个标签的2个订阅。 打开第三个选项卡,我再次订阅所有三个打开的​​选项卡,因此每个选项卡共有3个订阅,共有9个,依此类推。 我无法validation这一点,但我的猜测是,如果我可以创build一个订阅,我应该能够取消订阅,如果满足某些条件(即心跳失败,我必须断开连接)。 而这种情况发生的原因只是因为以下原因: 我开始setInterval一次,它的一个实例将永远运行,除非我停止它,或 服务器仍然试图发送数据到客户端试图保持连接打开? 至于1.,我已经试图用clearInterval杀死setInterval,它不起作用。 至于2,虽然可能不可能,但我倾向于相信… 以下是相关部分的服务器端代码片段(根据答案的build议编辑代码): server = http.createServer(function(req, res){ heartbeatPulse(res); }).listen(8888, '127.0.0.1', 511); server.on("request", function(req, res){ console.log("Request Received!"); var route_origin = url.parse(req.url); if(route_origin.query !== null){ […]

如何捕获SSE Eventsource确认

我正在使用此代码发送SSE消息给浏览器客户端。 https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback 节点服务器 response.writeHead(200, { 'Content-Type': 'text/event-stream', 'Access-Control-Allow-Origin': '*' }); response.write(message); response.end(); 而对于我使用这个javascript的客户端: var source = new EventSource('myurl'); source.addEventListener('add', addHandler, false); source.addEventListener('remove', removeHandler, false); 一切工作正常,但服务器如何知道客户端确实收到它? 我猜SSE正在使用TCP,有什么方法可以收到确认?

node.js中的SSE不会触发“message listener”,直到res.end()。 原因是在代码或

请咨询一下。 客户代码: var source = new EventSource('/notifications/stream'); source.addEventListener('open', function(e) { console.log('SSE connected') }, false); source.addEventListener('message', function(e) { alert('yes') console.log('SSE connected') }, false); 服务器代码 // set timeout as high as possible req.socket.setTimeout(Infinity); // send headers for event-stream connection // see spec for more information res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' }); res.write('\n'); setInterval(function(){ console.log('writing'); […]

使用Php将数据从一个客户端推送到另一个客户端

我正在进行我的空气质量监测系统的大学项目,数据(比如一些整数值)必须从传感单元到网页。 我想要的是 是由这个url http://localhost/AQProject/recordupdate.php?val=2调用的脚本更新显示内容的网页。 现在我知道我可以将数据保存在数据库中,并每两秒钟运行一次基于Ajax的查询来检查更新,但是我希望更新由服务器推送。 我做了什么: 我曾尝试Server sent events 。 这是我的尝试 <?php header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); if($_SERVER["REQUEST_METHOD"]=="GET") { if(empty($_GET["val"])) die ("Empty Value from source"); else { $v = $_GET['val']; echo "data: The Pollution stub value is {$v}".PHP_EOL; ob_flush(); flush(); } }?> 和HTML有脚本 <script> if(typeof(EventSource) !== "undefined") { var source = new EventSource("recordupdate.php"); source.onmessage = function(event) […]