Comet Longpollingでサーバーにメッセージを送信します
-
16-09-2019 - |
質問
クライアントからサーバーにデータを送信する最良の方法は何ですか?
私が使用しているコードの例はからです 基本的な「ロングポーリング」を実装するにはどうすればよいですか?
解決 3
はい、サーバーへの2番目の接続を使用するだけです。これは、IIRCを含むほとんどのフレームワークが行うことです Bayeuxプロトコル. 。実際にその2番目の接続が必要であることがわかった場合は、心配してください。
上記の私のリンクから変更されたいくつかの長期ポルティングコードを次に示します。
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();
};
注意すべき2つのこと。まず、多くのメッセージを送信し、キューがいっぱいになっている場合、かなりの遅れがあります。ピースごとではなく、毎回キュー全体を送信する方法を見つけることをお勧めします。これを行う1つの方法は、メッセージをJSONアレイに変換し、サーバーでデコードすることです。
第二に、メッセージを送信するエラーがある場合、メッセージを紛失しました。失敗したメッセージをキューに戻すか、成功するまで削除しないかのいずれかのコードが少し必要です。
他のヒント
XHRを使用して投稿を行うだけです。
1つの問題は、一部のブラウザで、サーバーごとに2つの(またはある数のn)XHR接続しか持たないことです。これを回避できます。これにより、現在のXHRが完了したときにすべての待機メッセージを投稿できるキューを作成し、その投稿が完了して前後に新しいキューに記入します。
サーバーにデータを送信することは、標準リクエストにすぎません。 XHRは大丈夫です、またはJSONPは、あなたのボートを浮かべるものは何でも。
長者に混乱しないでください。長期監督は、サーバーからクライアントに送信する方法としてのみ存在します。クライアントからサーバーにデータを送信することは、Webの開始以来、Webの存在であり、通常のXHR要求が必要です。