Node.JS上的服务器发送事件

时间:2011-03-24 04:51:51

标签: javascript node.js server-sent-events

我实际上正在尝试创建一个将使用Server-Sent Events draft的网络应用程序。根据我的知识,SSE每个连接使用一个线程,并且由于服务器将连续将数据泵送到客户端,即使一秒钟也没有闲置,我无法将线程放回池中。

因此我尝试使用Node.JS(我直到日期才使用)来处理与服务器的连接。我已经浏览了HTML5 Rocks introduction to SSE,并且有一个代码示例将SSE与Node.JS集成在一起。

但是,我很困惑Node.JS是否会同时处理数千个客户端连接并且比Apache服务器更有效地利用服务器?任何人都可以帮助我理解Node将如何在这里采取行动吗?

很抱歉,如果我听起来有点过于模糊。我准备尽可能多的澄清!谢谢!

4 个答案:

答案 0 :(得分:4)

PHP:

do {
  sendMsg($startedAt , time());
  sleep(5);
} while(true);

VS

的node.js

setInterval(function() {
  constructSSE(res, id, (new Date()).toLocaleTimeString());
}, 5000);

睡眠阻止php线程5秒的区别。在这5秒钟内,服务器需要有专门的线程,什么都不做。每个用户一个帖子。

使用node.js版本时,setInterval不会阻塞该线程。一个node.js线程可以处理所有用户。

答案 1 :(得分:3)

尝试查看有关并发连接的Understanding the node.js event loop文章。我建议创建一个使用WebSockets而不是服务器发送事件的Web应用程序,因为浏览器支持SSE的次数少于WebSockets。还有很多基于WebSocket的node.js模块,在GitHub上有源代码,可以“启发”你。

答案 2 :(得分:2)

  

然而,我对是否感到困惑   Node.JS将处理数千个   客户端连接并发和   更有效地利用服务器   比Apache服务器?谁能帮忙   我理解Node究竟会如何   在这里行动?

我认为您应该阅读Understanding event loops and writing great code for Node.js以更好地掌握事件循环。在node.js中没有任何阻塞可以节省大量的CPU周期。

同样TJ's ebook可以帮助您掌握事件。当某些事情发生时,将调用与该事件相关的回调。

答案 3 :(得分:1)

尝试使用express + connect-sse

var sse, express, app;

sse = require('connect-sse')();
express = require('express')

app = express()
app.get('/events', sse, function (req, res) {
  res.json("this is an event");
  res.json({here: "is", another: "event"});
});