1

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

我正在使用的示例代码来自如何实现基本的“长轮询”?

4

3 回答 3

1

只需使用 XHR 进行 POST。

一个问题是在某些浏览器上,每台服务器只能有 2 个(或某个数量 n)并发 XHR 连接。您可以通过创建一个队列来解决此问题,该队列允许您在当前 XHR 完成时发布所有等待消息,然后填充一个新队列直到该发布完成,然后来回。

于 2009-12-08T06:11:12.293 回答
1

向服务器发送数据只是一个标准请求。Xhr 很好,或者 JSONP,随便你的船。

不要对长轮询感到困惑;长轮询仅作为从服务器发送到客户端的一种方式存在。将数据从客户端发送到服务器是 Web 从一开始就一直在做的事情,而您只需要一个普通的 Xhr 请求。

于 2009-12-08T19:16:34.960 回答
1

是的,只需用完与服务器的第二个连接。这是大多数框架所做的,包括 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 不保证 xhrs 将按照您发送它们的顺序被接收。消息不会丢失(或者至少它们没有在我的测试中),这不是一个特定的长轮询问题,而是在使用 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 数组,并在服务器上解码。

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

于 2009-12-27T03:58:55.327 回答