簡體   English   中英

如何使用JavaScript ping IP地址

[英]How to ping IP addresses using JavaScript

我想運行一個JavaScript代碼來ping 4個不同的IP地址,然后檢索這些ping請求的丟包和延遲,並在頁面上顯示它們。

我該怎么做呢?

你不能從JS做到這一點。 你能做的是:

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

向服務器發出AJAX請求,然后為您ping目標服務器,並在AJAX結果中返回結果。

可能的警告:

  • 這告訴您目標服務器是否可以從服務器ping,而不是從用戶的客戶端ping
    • 所以客戶端將無法測試其LAN的主機
    • 但是你不應該讓主機檢查服務器內部網絡上的主機(如果存在)
    • 某些主機可能會阻止某些主機的流量,而不會阻止其
  • 你需要限制每台機器的ping數:
    • 避免AJAX請求超時
    • 當你一直在ping他們的網站時,一些網站運營商可能會非常沮喪
  • 資源
    • 長時間運行的HTTP請求可能會遇到服務器的最大連接限制,請檢查它的高度
    • 許多嘗試一次ping的用戶可能會產生可疑的流量(所有ICMP都沒有)
  • 並發性 - 您可能希望至少將上/下狀態池化/緩存幾秒鍾,以便希望ping同一目標的多個客戶端不會啟動大量的ping

我能想到的唯一方法是從外部服務器加載例如圖像文件。 當該加載失敗時,您“知道”服務器沒有響應(您實際上不知道,因為服務器可能只是阻止您)。

看看這個示例代碼,看看我的意思:

 /*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 :(");
     }

}

我受到最新評論的啟發,所以我寫了這段快速的代碼。

這是一種“HTTP ping”,我認為與XMLHttpRequest calls()一起使用非常有用,例如,找出哪些是在某些情況下使用最快的服務器或從用戶的互聯網收集一些粗略的統計信息連接速度。

這個小函數只是連接到不存在的URL上的HTTP服務器(預期返回404),然后測量服務器響應HTTP請求的時間,並在累計時間內進行平均和迭代次數。

請求的URL在每次調用時都會被randomely修改,因為我注意到(可能)某些透明代理或緩存機制,在某些情況下偽造結果,提供額外的快速答案(實際上比ICMP更快,這有點奇怪)。

注意使用適合真實HTTP服務器的FQDN! 結果將顯示為id為“result”的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"); 

請注意,我找不到此腳本的結果數字和相應服務器上的ICMP ping之間的簡單核心,盡管HTTP響應時間似乎與ICMP響應時間大致呈指數關系。 這可以通過HTTP請求傳輸的數據量來解釋,這可以根據Web服務器的風格和配置而變化,顯然是服務器本身的速度以及可能的其他原因。

這不是很好的代碼,但我認為它可以幫助並可能激勵其他人。

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

以上ping給定的Url。
通常用於計數器/分析。
它不會遇到客戶端失敗的響應(javascript)

你最接近JS的ping是使用AJAX,並檢索readystates,status和headers。 像這樣的東西:

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狀態設置條件,並根據需要進行輸出顯示等,以使其看起來更好。 更多的http url狀態檢查器而不是ping,但真的相同。 你總是可以循環幾次,讓它感覺更像是你的ping :)

是否可以從Javascript ping服務器?

應該看看上面的解決方案。 很漂亮。

顯然,不是我的,但想要說清楚。

你不能用Javascript PING。 我創建了Java servlet,如果活着則返回10x10像素的綠色圖像,如果死了則返回紅色圖像。 https://github.com/pla1/Misc/blob/master/README.md

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM