クライアントからサーバーにデータを送信する最良の方法は何ですか?
私が使用しているサンプル コードは、How do I implement basic "Long Polling"?からのものです。
クライアントからサーバーにデータを送信する最良の方法は何ですか?
私が使用しているサンプル コードは、How do I implement basic "Long Polling"?からのものです。
はい、サーバーへの 2 番目の接続を使い果たします。これは、バイユー プロトコルの iirc を含め、ほとんどのフレームワークで行われていることです。実際にその 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 は 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();
};
注意すべきことが2つあります。まず、大量のメッセージを送信していてキューがいっぱいになると、かなりの遅延が発生します。1 つずつ送信するのではなく、キュー全体を毎回送信する方法を見つけた方がよいでしょう。これを行う 1 つの方法は、メッセージを JSON 配列に変換し、サーバーでデコードすることです。
次に、メッセージの送信中にエラーが発生した場合は、メッセージを紛失したことになります。失敗したメッセージをキューに戻すか、成功するまでメッセージを削除しないようにするコードが必要です。
XHR を使用して POST を実行するだけです。
問題の 1 つは、一部のブラウザーでは、サーバーごとに 2 つ (または数 n) の同時 XHR 接続しか持てないことです。これを回避するには、現在の XHR が完了したときに待機中のすべてのメッセージを投稿できるキューを作成し、その投稿が完了するまで新しいキューを埋めて、前後に移動します。
サーバーへのデータの送信は、単なる標準的な要求です。Xhr または JSONP で問題ありません。ボートに浮かぶものは何でも構いません。
ロングポーリングに惑わされないでください。ロングポーリングは、サーバーからクライアントに送信する方法としてのみ存在します。クライアントからサーバーにデータを送信することは、Web が誕生して以来のことであり、必要なのは通常の Xhr 要求だけです。