Node.js和Comet

基本上,我试图从零开始使用node.js来build立一个基本的comet服务器和客户端。 一个试图谷歌关于这个过程的事情,它应该工作,当我testing它似乎工作正常。 然而,一个问题仍然在我的脑海。 首先我想告诉你的代码。

var http = require('http'); var sys = require('sys'); var fs = require('fs'); var qs = require('querystring'); var server = http.createServer(); var connections = []; server.on('request', function(req, res) { console.log(req.url); if(req.url == '/index') { fs.readFile(__dirname + '/index.html', function(err, data){ if(err) { res.writeHead(err, data); return res.end('Error loading index.html'); } res.writeHead(200); res.end(data); }); } else if(req.url == '/sendData') { if (req.method == 'POST') { var body = ''; req.on('data', function (data) { body += data; }); req.on('end', function () { var POST = qs.parse(body); console.log(POST); res.writeHead(200); res.end(""); broadcastData(POST); }); } } else { connections.push(res); } }); function broadcastData(data) { for(var i = 0; i < connections.length; i++) { connections[i].writeHead(200); connections[i].end(JSON.stringify({'message': data})); } } process.openStdin().addListener('data', function(chunk) { for(var i = 0; i < connections.length; i++) { connections[i].writeHead(200); var message = chunk.toString(); connections[i].end(JSON.stringify({'message': {'name': message}})); } }); server.listen(4000); 

客户端:

 function doComet() { $.getJSON('/', function(events){ doComet(); console.log(events); $('#content').append(events.message.name); }); } function sendData(data) { $.ajax({ type: "POST", url: "/sendData", contentType: 'application/javascript; charset=UTF-8', data: { name: "John", location: "Boston" } }).done(function( msg ) { console.log(msg) }); } 

所以有一个监听器发送我写在stdin上的数据,并且在客户端还有一个button,它将数据发送到服务器,服务器把它发送给所有的客户端。

我的问题是如果在很短的时间内发生很多事件呢? 我的意思是一旦从服务器获得了一个响应,就会发送另一个Ajax请求,但是当客户端还没有连接的时候应该有一个短的时间,如果在这段时间发生了什么,客户端将不会有新的数据。

那么我的想法对吗? 在这种情况下,我应该正确同步数据,以确保每个人都得到它。 有谁知道如何正确地做到这一点?

谢谢你的帮助!

彗星是所有旧的基于HTTP的黑客的总称,是我们想要摆脱的一个短语。 WebSockets是我们想要的地方; 浏览器和更多。 因此,如果您在构build实时解决scheme时感兴趣,那么您应该首先调查WebSockets,然后处理诸如HTTP Streaming和HTTP Long-Polling之类的回退。 有关更多信息,请参阅实时Web技术传输机制 。

您提供的示例将被归类为HTTP长轮询。

如果在很短的时间内发生了很多事件呢? 我的意思是,一旦从服务器获得响应,就会发送另一个Ajax请求,但是当客户端还没有连接时应该有一段时间,如果在这段时间内发生了什么,客户端将不会有新的数据

这是HTTP长轮询的一个限制,为什么HTTP Streaming是一个更好的解决scheme,并且WebSocket更好 – 当数据发送时连接不会closures。 使用任何种类的轮询解决scheme,您可能都需要一个解决scheme,确保在轮询请求期间接收和发送的消息不会被轮询客户端遗漏。

有几个解决scheme:

  1. 使用会话跟踪发送给特定客户端的最后一条消息。 当他们重新连接时,检查哪些消息是上次发送的,哪些消息已被错过并发送。
  2. 作为客户端轮询的一部分,发送lastMessageId 。 当服务器收到这个消息时,你可以检查是否是最后一条消息。 如果没有,你可以回复任何遗漏的消息。

实时networking技术的一个复杂性就是处理所有可能的连接场景。 所以,如果你这样做是一个学习经验,那么这绝对是有益的,也是有趣的。 但是,如果你正在创build一个应用程序来进入生产,我会推荐一个现有的实时框架。 请参阅实时networking技术指南 。