2012-01-31 17 views
2

問題は私が直面している問題です:イベントを引き起こすN個のIPadがあります。イベントを最初にトリガーしたサーバー側でどのように知るか。サーバー側で使用される言語は、PHPとクライアントサイドJavaScript(JQuery)です。最大の問題は待ち時間なので、AJAXポーリングを送信するだけでうまくいきません。なぜなら、jより前にボタンを押すことができますが、待ち時間のためにサーバがjリクエストを受け取ることができるからです。また、プレス時間を節約することは、IPadがミ​​リ秒以下の単位に同期されないので最適ではない。たぶん、私はいくつかのアイデアを得ることができるこれを扱ういくつかの種類のプロトコルがありますか?複数のクライアントの同期

+1

javascriptの日付を作成し、リクエストとともに送信できますか?単一のタイムゾーンに同期する必要がありますが、十分に単純なようです。 – mrtsherman

+2

このリアルタイムのタイミングを必要とする同期を希望しますか? – Joseph

+0

@mrtsherman各デバイスの正確な時刻設定を保証することはできません。あなたが正しい時間を表示している限り、デバイスがどのタイムゾーンにいるか気にしません。(強制的な時間同期メカニズムのようなものがない限り) – Joseph

答えて

1

ここでは、待ち時間の確認に使用できる2つの方法を示します。側を(要求がサーバーに到着したとき)

要求到着時刻がサーバーの時刻にする必要があり、待ち時間 -

あなたは、ユーザーの要求到着時刻要求=要求到着時間の

実際の時間を計算することができますユニットを同期させる必要はありません。クライアントからの要求データとともにレイテンシデータを取得する必要があります。平均待ち時間をポーリングして計算するクライアント側スクリプトを作成する必要があります。


第1の方法は、taken from a question here in stackoverflowである。これはajaxを使います。これは私がこれまでに検索した中で最も正確で、実際のものから10ms以内のものです。何それがないと、それはあなたのサーバーのページ(例では「/」のURLは、Webルートである)

  • 利点(AJAX経由)を呼び出している:我々は、返信後にイベントを発生jQueryのAJAX .success()を使用します応答データをロードする前に受信されます(要求サイズは関係ありません)。

  • 欠点:ajaxはクロスドメイン(援助なし)ではありません。しかし、あなた自身のサーバーを持っているなら、問題はありません。


もう一つはtaken from hereと私はそれを少し修正しました。これはもともとサーバーがまだ存在するかどうかをテストするサーバーテスターとして作成されたものです。

  • 利点:クロスドメイン(我々はimg = new Image() "画像プリローダ" メソッドを使用)

  • 欠点:インターネットの速度。コンテンツがロードされた後に起動するのは.onLoad()なので、ペイロードのサイズ(この場合は画像)とインターネットの速度が重要になります。

画像サイズに応じて、約200-400msのずれがあります。

//this is a static class. values are preserved. do resets before and after use. 
var ping = { 

    //the sample image. make it as small as possible like 1 x 1 px black and white. 
    //we are only testing ping, not download times 
    //replace with your own image on your server since this link will die soon 
    picture: "http://205.196.122.17/vh8cvmdtgfsg/8nsd22kphe1fz5w/spacer.bmp", 

    //placeholder for test subject 
    pictureFrame: null, 

    //timer 
    timer: null, 

    reset: function(){ 
     //clear timeouts and timer 
     clearTimeout(ping.timer); 
     ping.timer = null; 

     //clear the picture frame 
     ping.pictureFrame = null; 
    }, 

    //start ping function 
    init: function() { 

     //reset 
     ping.reset(); 

     //get time before request 
     var preSess = new Date(); 
     var preTime = preSess.getTime(); 

     //append current timestamp so request won't be from cache 
     var pictureUri = ping.picture + "?time=" + preTime; 

     //create placeholder  
     ping.pictureFrame = new Image(); 
     ping.pictureFrame.onload = function() { 

      //get time after load 
      var postSess = new Date(); 
     var postTime = postSess.getTime(); 
      var requestTime = postTime - preTime; 

      alert("Ping took "+requestTime+"ms"); 

      //reset 
     ping.reset(); 
     }; 

     //triggers loading 
     ping.pictureFrame.src = pictureUri; 

     //set maximum timeout (in ms) before we declare domain not there 
     ping.timer = setTimeout("ping.failed()", 60000); 
    }, 

    //time-out reached 
    failed: function() { 
     //reset 
     ping.reset(); 

     //alert what happened 
     alert("Ping took too long"); 
    } 
}; 

ping.init(); 
関連する問題