javascript – Node.js和Comet

基本上,我试图从头开始使用node.js建立一个基本的彗星服务器和客户端.一个尝试谷歌的事情它应该工作的过程,因为我正在测试它似乎工作正常.然而,一个问题仍在我脑海中.首先,我想向您展示代码.
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请求被发送,但是当客户端尚未连接时应该有很短的时间,并且如果在此期间发生某些事情,则客户端将不具有新数据.

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

谢谢你的帮助!

解决方法

Comet是所有旧的基于HTTP的黑客的总称,是我们想要摆脱的一个短语. WebSockets是我们想要的地方;浏览器及其他.因此,如果您对构建实时解决方案感兴趣,那么您应该首先调查WebSockets,然后处理诸如HTTP Streaming和HTTP Long-Polling之类的后退.有关更多信息,请参阅 Realtime Web Technology Transport Mechanisms.

您提供的示例将被归类为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.

相关文章

什么是深拷贝与浅拷贝?深拷贝与浅拷贝是js中处理对象或数据...
前言 今天复习了一些前端算法题,写到一两道比较有意思的题:...
最近在看回JavaScript的面试题,this 指向问题是入坑前端必须...
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面