如何使用JavaScript ping IP地址

如何使用JavaScript ping IP地址,javascript,ping,latency,Javascript,Ping,Latency,我想运行一个JavaScript代码ping 4个不同的IP地址,然后检索这些ping请求的数据包丢失和延迟,并在页面上显示它们 我如何做到这一点?你不能从JS做到这一点。你能做的是: client --AJAX-- yourserver --ICMP ping-- targetservers 向服务器发出AJAX请求,然后服务器将为您ping目标服务器,并在AJAX结果中返回结果 可能的注意事项: 这将告诉您是否可以从您的服务器而不是用户的客户端ping目标服务器 因此,客户端将无法测

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


我如何做到这一点?

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

 client --AJAX-- yourserver --ICMP ping-- targetservers
向服务器发出AJAX请求,然后服务器将为您ping目标服务器,并在AJAX结果中返回结果

可能的注意事项:

  • 这将告诉您是否可以从您的服务器而不是用户的客户端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 :(");
     }

}
上面ping给定的Url。
通常用于计数器/分析。

它不会遇到失败的客户端响应(javascript)

在JS中最接近ping的方法是使用AJAX,并检索readystate、status和header。大概是这样的:

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();
url=“”
ping=新的XMLHttpRequest();
ping.onreadystatechange=函数(){
document.body.innerHTML+=“
”+ping.readyState; 如果(ping.readyState==4){ 如果(ping.status==200){ 结果=ping.getAllResponseHeaders(); document.body.innerHTML+=“
”+结果+“
”; } } } ping.open(“GET”,url,true); ping.send();

当然,您也可以为不同的http状态设置条件,并通过描述等使输出以您想要的方式显示,以使其看起来更好。与其说是ping,不如说是一个http-url状态检查器,但实际上是相同的想法。你也可以循环几次,让它更像是一个ping:)

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

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

这个小函数只是连接到一个不存在的URL上的HTTP服务器(预期返回404),然后测量服务器响应HTTP请求的时间,并计算累计时间和迭代次数的平均值

请求的URL在每次调用时都会被随机修改,因为我注意到(可能)某些透明代理或缓存机制在某些情况下会导致伪造,从而给出非常快速的答案(比ICMP更快,这有点奇怪)

小心使用适合真正HTTP服务器的FQDNs! 结果将显示给id为“result”的主体元素,例如:

<div id="result"></div>
注意,虽然HTTP响应时间与ICMP响应时间大致呈指数关系,但我无法在该脚本的结果数字与相应相同服务器上的ICMP ping之间找到简单的相关性。这可以通过HTTP请求传输的数据量来解释,根据web服务器的风格和配置、服务器本身的速度以及可能的其他原因,数据量可能会有所不同


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

你不能用Javascript PING。我创建了一个JavaServlet,如果活着,它将返回一个10x10像素的绿色图像,如果死了,它将返回一个红色图像

你应该看看上面的解决方案。相当圆滑


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

与。你应该看看上面的解决方案。这不是ping,这是一个HTTP请求(因此是TCP/IP)。此外,如果目标没有运行HTTP服务器,请求将需要很长时间才能超时;另外,加载是异步的-除非图像已经在缓存中,否则如果在设置
src
后立即检查ImageObject.height,它将返回0;如果它在缓存中,无论目标是否启动,它都将返回“Ping worked”。放松Piskvor-你完全正确,这不是一个真正的ping(你的解决方案也不是)-你需要能够打开套接字并发送任意TCP/IP数据包来模拟ping-为了简单起见,我刚刚调用了ping方法。如果目标不运行HTTP服务器,这将花费很长时间,这也是正确的,因此我写了“指向已知图像的URL”。。。缓存也是一个问题。这是一个可以采用的方法的简单演示,与CSS历史黑客的原理相同。谢谢你的否决票。不要把否决票当真,我没有否决你;我只是觉得它并没有真正回答这个问题——尽管这是一种检查已知HTTP服务器是否启动的简单方法,但它并没有真正回答ping丢失或延迟。我同意我的方法不是从客户端的计算机上ping,这将需要大量降低的权限和许多安全漏洞(以及ActiveX)。不是针对个人:-
<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");