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上写的数据,并且客户端也有一个按钮,它将数据发送到服务器,服务器将它发送给所有客户端.
我的问题是如果很多事件在很短的时间内发生了怎么办?我的意思是,一旦响应从服务器获得另一个ajax请求被发送,但是当客户端尚未连接时应该有很短的时间,并且如果在此期间发生某些事情,则客户端将不具有新数据.
那么我的想法是对的吗?在这种情况下,我应该以适当的方式同步数据,以确保每个人都能得到它.有人知道如何正确地做到这一点吗?
谢谢你的帮助!
解决方法
您提供的示例将被归类为HTTP长轮询.
what if a lot of events happen in a really short amount of time? I mean as soon as a response got from the server another ajax request is sent but there should be a short amount of time when the client is not connected yet and if happens something during that time the client will not have the fresh data
这是HTTP长轮询的一个限制,以及为什么HTTP Streaming是一个更好的解决方案,而WebSockets仍然更好 – 在发送数据时不会关闭连接.使用任何类型的轮询解决方案,您可能需要一种解决方案,以确保轮询客户端不会错过轮询请求期间收到和发送的消息.
有几个解决方案:
>使用会话来跟踪发送到特定客户端的最后一条消息.当他们重新连接时,检查上次发送的消息,哪些消息已丢失并发送.
>作为客户端轮询的一部分,发送lastMessageId.当服务器收到此信息时,您可以检查这是否是最后一条消息.如果没有,您可以回复任何错过的消息.
实时Web技术的复杂性之一是处理所有可能的连接方案.所以,如果你这样做是一种学习经历,那么它肯定是有益的,也是有趣的.但是,如果您要创建一个应用程序以进入生产,我会建议现有的实时框架.见realtime web tech guide.