将消息发送给服务器,并长时间进行彗星
-
16-09-2019 - |
题
将数据从客户端发送到服务器的最佳方法是什么?
我正在使用的示例代码来自 我如何实施基本的“长投票”?
解决方案 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请求。
不隶属于 StackOverflow