将数据从客户端发送到服务器的最佳方式是什么?
我正在使用的示例代码来自如何实现基本的“长轮询”?
只需使用 XHR 进行 POST。
一个问题是在某些浏览器上,每台服务器只能有 2 个(或某个数量 n)并发 XHR 连接。您可以通过创建一个队列来解决此问题,该队列允许您在当前 XHR 完成时发布所有等待消息,然后填充一个新队列直到该发布完成,然后来回。
向服务器发送数据只是一个标准请求。Xhr 很好,或者 JSONP,随便你的船。
不要对长轮询感到困惑;长轮询仅作为从服务器发送到客户端的一种方式存在。将数据从客户端发送到服务器是 Web 从一开始就一直在做的事情,而您只需要一个普通的 Xhr 请求。
是的,只需用完与服务器的第二个连接。这是大多数框架所做的,包括 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 数组,并在服务器上解码。
其次,如果发送消息时出错,那么您已经丢失了消息。需要有一些代码将失败的消息推回队列,或者在成功之前不将其删除。