我想运行一个 JavaScript 代码来 ping 4 个不同的 IP 地址,然后检索这些 ping 请求的丢包和延迟并将它们显示在页面上。
我该怎么做呢?
我想运行一个 JavaScript 代码来 ping 4 个不同的 IP 地址,然后检索这些 ping 请求的丢包和延迟并将它们显示在页面上。
我该怎么做呢?
你不能从 JS 中做到这一点。你可以做的是:
client --AJAX-- yourserver --ICMP ping-- targetservers
向您的服务器发出 AJAX 请求,然后该服务器将为您 ping 目标服务器,并在 AJAX 结果中返回结果。
可能的警告:
我能想到的唯一方法是从外部服务器加载例如图像文件。当加载失败时,您“知道”服务器没有响应(您实际上不知道,因为服务器可能只是阻止了您)。
看看这个示例代码,看看我的意思:
/*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 调用()一起使用非常有用,例如确定在某些情况下使用哪个服务器最快或从用户的互联网收集一些粗略的统计数据连接速度。
这个小函数只是在不存在的 URL 上连接到 HTTP 服务器(预计会返回 404),然后测量直到服务器响应 HTTP 请求的时间,并对累计时间进行平均和迭代次数。
请求的 URL 在每次调用时都会随机修改,因为我注意到(可能)一些透明代理或缓存机制在某些情况下会导致伪造,从而提供额外的快速答案(实际上比 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");
请注意,尽管 HTTP 响应时间似乎与 ICMP 响应时间大致呈指数关系,但我无法在该脚本的结果数字与相应相同服务器上的 ICMP ping 之间找到简单的相关性。这可能是由于通过 HTTP 请求传输的数据量可能会因 Web 服务器的风格和配置而异,显然是服务器本身的速度以及可能的其他原因。
这不是很好的代码,但我认为它可以帮助并可能启发他人。
在 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 状态检查器,但实际上是相同的想法。你总是可以循环几次,让它感觉更像是对你的 ping :)
function ping(url){
new Image().src=url
}
以上 ping 给定的 Url。
通常用于计数器/分析。
它不会遇到对客户端的失败响应(javascript)