将数据从客户端发送到服务器的最佳方法是什么?

我正在使用的示例代码来自 我如何实施基本的“长投票”?

有帮助吗?

解决方案 3

是的,只需将第二个连接到服务器即可。这是大多数框架所做的,包括IIRC BAYEUX协议. 。如果您发现实际上需要第二个连接,请担心。

这是从我上面的链接中修改的一些长抽取代码:

var userid = Math.ceil(1000000*Math.random()).toString(16).toUpperCase();
var startLongpoll = function() {
    $.ajax({
        type:"POST", async:true, cache:false, timeout:0, 
        data: {userid: userid},
        success: function(data){
            _outCallback(data);
            setTimeout( startLongpoll, 10 );
        },
        error: function(xhr, textStatus, errorThrown){
            _errCallback(textStatus+" ("+errorThrown+")");
            setTimeout( startLongpoll, 5000 );
        },
    });
};
setTimeout(startLongpoll,10);

Moishe与队列谈论的是,JS不能保证将按照您派遣它们的顺序收到XHR。这些消息不会丢失(或者至少没有参加我的测试),这不是一个特定的长期播放问题,而是在使用XHR发送时要考虑的事情。

因此,这是队列代码:

var queue = [];
var busy = false;
this.send = function(msg) {
    queue[queue.length] = msg;
    if (busy) return;
    busy=true;
    var s = function() {
        var m = queue.shift();
        $.ajax({
            type:"POST", async:true, cache:false, timeout: 5000,
            data: {userid:userid, msg:m},
            error: function(xhr, textStatus, errorThrown){
                _errCallback(textStatus + " (" + errorThrown + ")");
                if (queue.length>0) s(); else busy = false;
            },
            success: function(){
                if (queue.length>0) s(); else busy = false;
            }
        });
    }
    s();
};

有两件事要注意。首先,如果您发送了许多消息,并且队列正在填充,则有很大的滞后。最好找到一种每次发送整个队列的方法,而不是按一段方式发送。一种方法是将消息转换为JSON数组,并在服务器上解码。

其次,如果有错误发送消息,那么您已经丢失了消息。需要有一些代码,可以将失败的消息推回队列,或者在成功之前不将其删除。

其他提示

只需使用XHR即可完成帖子。

一个问题是在某些浏览器上,您只能拥有每个服务器的2个(或数字n)并发XHR连接。您可以通过制作一个队列来解决此问题,该队列可让您在当前XHR完成时发布所有等待消息,然后填充新队列,直到该帖子完成为止。

将数据发送到服务器只是标准请求。 XHR很好,或者JSONP,无论您的船漂浮着什么。

不要对长期播种感到困惑;长期播放仅作为将服务器发送到客户端的一种方式。自Web成立以来,将数据从客户端发送到服务器的目的是正常的XHR请求。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top