我该如何改进这个ping.js脚本。似乎越来越高了

时间:2014-03-23 23:04:23

标签: javascript ping

我已经制作了这个ping.js脚本但是我似乎得到了相当高的ping,即使我从CMD ping我得到的ping也低得多。无论如何,我能够显示真正的ping而不是更高的值,这将是值得赞赏的。

    function colorcode(ms){
    if (ms < 65) {return "#8bc53f";
    } else if ((ms >= 65) && (ms < 160)) { return "#f26522";
    } else if ((ms >= 160) && (ms < 400)) { return "#ed1c24";
    } else if ((ms >= 400) && (ms < 1000)) { return "#ed1c24";
    } else { return "#232323"; }

}

function output_text(txt,id){
    txt = Math.round((3/4)*txt);
    var obj = document.getElementById(id);
    var txt_ = "<font color='"+colorcode(parseInt(txt))+"'>"+((parseInt(txt)<1000)?txt+"</font> ms":"Offline</font>");
    obj.innerHTML=txt_;
}

function reping() {
i = 2;
for(var id in idips){
setTimeout("ping2('"+id+"','"+idips[id]+"',"+(i*2+1)+")",i);
i += 100;
}}

var idips = new Array();

function ping(id,ip,i){
    document.write("<span id='"+id+"'>pinging server...</span>");
    setTimeout("ping2('"+id+"','"+ip+"',"+i+")",(i+2)*100);
    idips[id] = ip;
}

function koekjes(){
var koekje = new Array('k','o','e','j','w','s');
var koek = new Array();
var rd = new Array();
var koekz = '';
var rd = new Array();
for(i=0;i<=21;i++){
rd[i] = Math.floor(Math.random()*koekje.length);
koekz += koekje[rd[i]];
}
return koekz
}

function ping2(id,ip,i) {
    var ImageObject = new Image();
    ImageObject.onerror = function(evt){ var endTime = new Date(); output_text(endTime-startTime,id);}
    ImageObject.onload = function(evt){ var endTime = new Date(); output_text(endTime-startTime,id);}
    var startTime = new Date();
    ImageObject.src = "http://"+ip+"/"+koekjes()+".gif";
}

感谢。

1 个答案:

答案 0 :(得分:1)

您可以衡量发送请求和获得答案之间的延迟。

命令行程序ping使用ICMP数据包,您使用HTTP请求。

HTTP请求需要建立TCP连接,发送请求(HTTP非常繁琐),解析请求,处理请求,发送响应以及解析响应。< / p>

但主要问题是握手,这使得请求慢了三倍。

要获得实际延迟,您无法使用time / 3,因为连接可能是kept alive,在这种情况下没有握手。

总结:不要使用HTTP / TCP来衡量延迟。


编辑:

您可以只连接到一个关闭的端口,如3或4.在这种情况下,服务器会拒绝连接尝试(TCP syn)。 (Syn是TCP握手的第一部分。)

在线演示:http://jsfiddle.net/wDz38/