我想运行一个JavaScript代码来ping 4个不同的IP地址,然后检索这些ping请求的丢包和延迟,并在页面上显示它们。
我该怎么做?
答案 0 :(得分:19)
你不能从JS那里做到这一点。你能做的是:
client --AJAX-- yourserver --ICMP ping-- targetservers
向服务器发出AJAX请求,然后为您ping目标服务器,并在AJAX结果中返回结果。
可能的警告:
答案 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)