如何使用JavaScript ping IP地址

时间:2011-02-10 08:14:34

标签: javascript ping latency

我想运行一个JavaScript代码来ping 4个不同的IP地址,然后检索这些ping请求的丢包和延迟,并在页面上显示它们。

我该怎么做?

8 个答案:

答案 0 :(得分:19)

你不能从JS那里做到这一点。你能做的是:

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

向服务器发出AJAX请求,然后为您ping目标服务器,并在AJAX结果中返回结果。

可能的警告:

  • 这告诉您目标服务器是否可以从服务器ping,而不是从用户的客户端ping
    • 因此客户端将无法测试其LAN的主机
    • 但您不应让主机检查服务器内部网络上的主机(如果存在)
    • 某些主机可能会阻止来自某些主机的流量而非其他主机
  • 您需要限制每台机器的ping数:
    • 以避免AJAX请求超时
    • 当您一直对其网站进行ping操作时,某些网站运营商会感到非常沮丧
  • 资源
    • 长时间运行的HTTP请求可能会遇到服务器的最大连接限制,检查它的高度
    • 许多尝试同时ping通的用户可能会产生可疑的流量(所有ICMP都没有)
  • 并发 - 您可能希望至少将上/下状态池化/缓存几秒钟,以便希望ping同一目标的多个客户端不会启动大量ping操作

答案 1 :(得分:4)

我能想到的唯一方法是加载例如来自外部服务器的图像文件。当该加载失败时,您“知道”服务器没有响应(您实际上不知道,因为服务器可能只是阻止您)。

看看这个示例代码,看看我的意思:

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

}

答案 2 :(得分:2)

我受到最新评论的启发,所以我写了这段快速的代码。

这是一种" HTTP ping"我认为与XMLHttpRequest calls()一起使用非常有用,例如找出哪些是在某些情况下使用最快的服务器,或从用户的互联网连接速度中收集一些粗略的统计数据。

这个小功能只是连接到不存在的URL上的HTTP服务器(预计会返回404),然后测量服务器应答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"); 

请注意,我无法在此脚本的结果数字和相应的相同服务器上的ICMP ping之间找到简单的核心,但HTTP响应时间似乎与ICMP响应时间大致呈指数关系。这可以通过HTTP请求传输的数据量来解释,这可以根据Web服务器的风格和配置而变化,显然是服务器本身的速度以及可能的其他原因。

这不是很好的代码,但我认为它可以帮助并可能激励其他人。

答案 3 :(得分:1)

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

以上ping给定的Url。
通常用于计数器/分析。
它不会遇到客户端(javascript)的失败回复

答案 4 :(得分:1)

您最接近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:)

答案 5 :(得分:0)

我想出了一些东西,因为我厌倦了几个小时又一个小时地搜索每个人都说“不可能”的东西,我发现的唯一一件事就是使用 jQuery。 我想出了一种使用 Vanilla JS(除了基本 JavaScript)的简单新方法。

这是我的 JSFiddle:https://jsfiddle.net/TheNolle/5qjpmrxg/74/

基本上,我创建了一个名为“start”的变量,我给出了时间戳,然后我尝试将一个不可见图像的源设置到我的网站(不是图像)[可以更改为任何网站],因为它是不是图像,它创建了一个错误,我用它来执行代码的第二部分,此时我创建了一个名为“end”的新变量,我从这里给出时间戳(与“开始”不同)。之后,我只是做了一个减法(我从“结束”中减去“开始”),这给了我 ping 这个网站所需的延迟。 做出选择后,您可以将其存储在一个值中,将其粘贴到您的网页上,将其粘贴到控制台中,等等。

let pingSpan = document.getElementById('pingSpan');
// Remove all the way to ...
let run;

function start() {
  run = true;
  pingTest();
}

function stop() {
  run = false;
  setTimeout(() => {
    pingSpan.innerHTML = "Stopped !";
  }, 500);
}

// ... here

function pingTest() {
  if (run == true) { //Remove line
    let pinger = document.getElementById('pingTester');
    let start = new Date().getTime();
    pinger.setAttribute('src', 'https://www.google.com/');
    pinger.onerror = () => {
      let end = new Date().getTime();
      // Change to whatever you want it to be, I've made it so it displays on the page directly, do whatever you want but keep the "end - start + 'ms'"
      pingSpan.innerHTML = end - start + "ms";
    }
    setTimeout(() => {
      pingTest();
    }, 1000);
  } // Remove this line too
}
body {
  background: #1A1A1A;
  color: white
}

img {
  display: none
}
Ping:
<el id="pingSpan">Waiting</el>
<img id="pingTester">

<br> <br>

<button onclick="start()">
  Start Ping Test
</button>
<button onclick="stop()">
  Stop
</button>

答案 6 :(得分:-2)

你不能用Javascript PING。我创建了Java servlet,如果活着则返回10x10像素的绿色图像,如果死了则返回红色图像。 https://github.com/pla1/Misc/blob/master/README.md

答案 7 :(得分:-2)

Is it possible to ping a server from Javascript?

应该查看上面的解决方案。很漂亮。

显然不是我的,但是想说清楚。