2011-02-10 242 views
7

JavaScriptコードを実行して4つの異なるIPアドレスをpingし、これらのping要求のパケット損失と待ち時間を取得してページに表示したいとします。JavaScriptを使用してIPアドレスをpingする方法

どうすればよいですか?

+0

[この質問に関する](http://stackoverflow.com/questions/4954587/getting-client-to-automatically-send-data-to-server) –

+0

http://stackoverflow.com/questions/4282151/is-it-possible-to-ping-a-server-from-javascript上記の解決策をチェックする必要があります。かなり滑らか。 –

答えて

16

JSからはできません。何あなたができることはこれです:

client --AJAX-- yourserver --ICMP ping-- targetservers 

その後、あなたのためのターゲットサーバをping、およびAJAX結果に結果を返しますサーバーにAJAX要求を、確認します。

可能な注意事項:

  • これは、ターゲットサーバはので、クライアントがホストのLAN
  • をテストすることができませんではないユーザーのクライアント
    • から、サーバーからping可能であるかどうかがわかります
    • ホストがサーバーの内部ネットワーク上のホストをチェックするようにしないでください。
    • 一部のホストでは特定のホストからのトラフィックをブロックすることがあります。他のホストからのトラフィックをブロックすることがあります。
  • あなたがマシンごとのpingの数を制限する必要があります:あなたは
すべての時間を自分のサイトにpingを維持したタイミングからAJAX要求を避けるために
  • 一部のサイト運営者は、非常に怒ることができます
  • リソース
    • 長時間実行HTTPリクエストは、それがどのように高いチェック、サーバーの最大接続数の制限に実行することができ
    • 0123一度にpingを実行しようとして人の
    • 多くのユーザーが不審に見えるトラフィック(すべてのICMP何もない)を生成する場合があります
  • 同時実行 - あなたはそう、少なくとも数秒間アップ/ダウンの状態をキャッシュ/プールに望むこと同じターゲットをpingしようとしている複数のクライアントは、pingのフラッドを起動しません。
4

私が考えることができる唯一の方法はローディングです。外部サーバからの画像ファイル。そのロードが失敗すると、サーバーが応答していないことがわかります(サーバーがあなたをブロックしている可能性があるため、実際はわかりません)。

私が何を意味するかを確認するには、この例のコードを見てみましょう:pingを実行し、指定したURLの上

/*note that this is not an ICMP ping - but a simple HTTP request 
    giving you an idea what you could do . In this simple implementation it has flaws 
    as Piskvor correctly points out below */ 
    function ping(extServer){ 
    var ImageObject = new Image(); 
    ImageObject.src = "http://"+extServer+"/URL/to-a-known-image.jpg"; //e.g. logo -- mind the caching, maybe use a dynamic querystring 
    if(ImageObject.height>0){ 
     alert("Ping worked!"); 
    } else { 
     alert("Ping failed :("); 
    } 

} 
+4

これはpingではない、つまりHTTPリクエスト(したがってTCP/IP)です。また、ターゲットがHTTPサーバーを実行しない場合、要求は* loooong *タイムアウトになります。また、イメージがキャッシュ内に存在しない限り、ローディングは非同期です(ImageObject)。'src'を設定した直後にチェックすると、heightは0を返します。キャッシュに*ある場合は、ターゲットが起動しているかどうかにかかわらず、 "Ping worked"を返します。 http://en.wikipedia.org/wiki/Ping – Piskvor

+0

Relax Piskvor - これは本当のping(どちらもあなたの解決策ではない)が間違いない - ソケットを開いて任意のTCP/IPを送信できる必要があるパケットをpingをシミュレートする - 私は単純化のためにメソッドpingを呼び出したばかりです。また、ターゲットがHTTPサーバーを実行していない場合、それは長い時間がかかります - したがって、私は "既知のイメージへのURL"と書いています...また、キャッシュが問題です。これは、あなたが取ることのできるアプローチの**簡単な**デモンストレーション、CSSヒストリーのハックと同じ原則でした。 downvoteありがとう。 –

+0

私はdownvoteを個人的に取っていない、私はdownvote *あなた*;私はちょうどそれが実際に質問に答えないと感じました。*既知のHTTPサーバがアップしているかどうかを調べる簡単な方法ですが、実際にはpingの損失や待ち時間には答えません。私は自分のアプローチがクライアントのコンピュータからpingをしていないことに同意します。これは、多くの低い権限と多くのセキュリティホール(およびActiveX)を必要とします。 – Piskvor

1
function ping(url){ 
new Image().src=url 
} 


一般的にカウンタ/アナリティクスに使用されます。
クライアント(JavaScript)への応答に失敗することはありません

+0

これはicmpパケットを送信しません – mulllhausen

+0

これは、サーバーがhttp要求などの要求に応答するかどうかをチェックします。 pingは全く別のものです。 –

2

JSのpingに最も近いのは、AJAXを使用して読み込み、状態、ヘッダーを取得していることです。このような何か:もちろん

url = "<whatever you want to ping>" 
ping = new XMLHttpRequest();  
ping.onreadystatechange = function(){ 

    document.body.innerHTML += "</br>" + ping.readyState; 

    if(ping.readyState == 4){ 
     if(ping.status == 200){ 
      result = ping.getAllResponseHeaders(); 
      document.body.innerHTML += "</br>" + result + "</br>"; 
     } 
    } 

} 
ping.open("GET", url, true);  
ping.send(); 

あなたはまた、別のHTTPステータスのために条件を入れて、それは立派に見えるように、しかし、あなたは、などの説明をしたい出力表示を行うことができます。 pingよりもhttp url status checkerのほうが多いですが、実際は同じアイデアです。あなたはいつもそれを数回繰り返すことで、あなたのpingのように感じることができます:)

+0

AJAXを使用し、準備完了状態を取得することのアイデアは、私の仕事です。このコンテンツに他のステートメントを追加するにはどうすればいいですか? URLが利用できない場合と同様に、私はユーザーにマッサージを印刷したいと思います。 document.getElementById( "div")のようにinnerHTML = "Pingは成功しません!"; –

2

私はこの最新のコードを書いています。

これは、XMLHttpRequestの呼び出し()と一緒に使用すると非常に便利な「HTTP ping」の一種です。たとえば、場合によっては最も高速なサーバーのどちらかを使用したり、ユーザーのインターネット接続速度から

この小さな機能は、存在しないURL(404を返すと予想される)上のHTTPサーバーに接続しているだけで、サーバーがHTTP要求に応答して平均を実行するまでの時間を測定しています累積された時間と反復の回数に依存します。私が気づいたので、

要求されたURLは、各呼び出しでrandomely修正された(おそらく)いくつかの透明プロキシやキャッシュ機構の余分な高速な答えを与え、いくつかのケースで結果を偽造(ICMPより速く、実際にやや奇妙なもの)。

実際のHTTPサーバーに適合するFQDNを使用するように注意してください。 結果は、例えば、ID "結果" とbody要素に表示されます。

<div id="result"></div> 

機能コード:例えば

function http_ping(fqdn) { 

var NB_ITERATIONS = 4; // number of loop iterations 
var MAX_ITERATIONS = 5; // beware: the number of simultaneous XMLHttpRequest is limited by the browser! 
var TIME_PERIOD = 1000; // 1000 ms between each ping 
var i = 0; 
var over_flag = 0; 
var time_cumul = 0; 
var REQUEST_TIMEOUT = 9000; 
var TIMEOUT_ERROR = 0; 

document.getElementById('result').innerHTML = "HTTP ping for " + fqdn + "</br>"; 

var ping_loop = setInterval(function() { 


     // let's change non-existent URL each time to avoid possible side effect with web proxy-cache software on the line 
     url = "http://" + fqdn + "/a30Fkezt_77" + Math.random().toString(36).substring(7); 

     if (i < MAX_ITERATIONS) { 

      var ping = new XMLHttpRequest(); 

      i++; 
      ping.seq = i; 
      over_flag++; 

      ping.date1 = Date.now(); 

      ping.timeout = REQUEST_TIMEOUT; // it could happen that the request takes a very long time 

      ping.onreadystatechange = function() { // the request has returned something, let's log it (starting after the first one) 

       if (ping.readyState == 4 && TIMEOUT_ERROR == 0) { 

        over_flag--; 

        if (ping.seq > 1) { 
         delta_time = Date.now() - ping.date1; 
         time_cumul += delta_time; 
         document.getElementById('result').innerHTML += "</br>http_seq=" + (ping.seq-1) + " time=" + delta_time + " ms</br>"; 
        } 
       } 
      } 


      ping.ontimeout = function() { 
       TIMEOUT_ERROR = 1; 
      } 

      ping.open("GET", url, true); 
      ping.send(); 

     } 

     if ((i > NB_ITERATIONS) && (over_flag < 1)) { // all requests are passed and have returned 

      clearInterval(ping_loop); 
      var avg_time = Math.round(time_cumul/(i - 1)); 
      document.getElementById('result').innerHTML += "</br> Average ping latency on " + (i-1) + " iterations: " + avg_time + "ms </br>"; 

     } 

     if (TIMEOUT_ERROR == 1) { // timeout: data cannot be accurate 

      clearInterval(ping_loop); 
      document.getElementById('result').innerHTML += "<br/> THERE WAS A TIMEOUT ERROR <br/>"; 
      return; 

     } 

    }, TIME_PERIOD); 
} 

、打ち上げで:

fp = new http_ping("www.linux.com.au"); 

なお、Iこのスクリプトの結果数値と対応する同じサーバのICMP pingの間にシンプルなコリアレーションが見つかりませんでしたが、HTTP応答時間はICMP再解析のおおよそ指数関数であるようですスポンサー時間。これは、Webサーバーの風味や構成、明らかにサーバー自体の速度、おそらく他の理由によって異なるHTTP要求によって転送されるデータの量によって説明できます。

これはあまり良いコードではありませんが、私はそれが他の人を助け、おそらくインスピレーションを与えると思っていました。

-2

JavascriptでPINGすることはできません。生存している場合は10x10ピクセルの緑のイメージを返し、死んだ場合は赤いイメージを返すJavaサーブレットを作成しました。 https://github.com/pla1/Misc/blob/master/README.md

-1

Is it possible to ping a server from Javascript?

上記のソリューションをチェックアウトする必要があります。かなり滑らか。

明らかにそうではありませんが、明確にしたいと思いました。

+0

この回答を投票しても意味がありません。問題はJavascriptを使ってPingを実行する方法で、Javascriptを使ってPingを効果的に行う方法を示しています。他に誰かが期待できるものが何であるか分からない。ただし、代理人の控除をありがとう、非常に感謝します。ワオ。 –

関連する問題