你无法从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 :(");
}
}
src
属性:"http://" + ipOrHost + "?pingedat=" + new Date().getTime();
。 - fny<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");
在JS中,最接近ping的方法是使用AJAX,并检索readystates、状态和头信息。以下是一个示例:
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();
由于我对搜索几个小时都没有找到的被大家认为“不可能”的东西感到厌倦,所以我想出了一个新的简单方法,使用基础JavaScript(没有其他任何东西)。
这是我的JSFiddle:https://jsfiddle.net/TheNolle/5qjpmrxg/74/
基本上,我创建了一个名为“start”的变量,给它一个时间戳,然后尝试将一个不是图片的源设置为我的网站(可以更改为任何网站)的不可见图像。因为它不是图像,所以会创建一个错误,我用它来执行代码的第二部分,在这个时候我创建了一个名为“end”的新变量,给它从这里获取的时间戳(与“start”不同)。之后,我只需做一个减法(从“end”中减去“start”),就能得到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>
function ping(url){
new Image().src=url
}
上述代码会ping给定的URL。
通常用于计数器/分析工具。
它不会向客户端(JavaScript)返回失败的响应。
我建议使用“head”来仅请求头部信息。
xhr.open('head', 'asstes/imgPlain/pixel.txt' + cacheBuster(), true);
然后询问readyState 2 - HEADERS_RECEIVED, 表示已经调用了send()方法且头部和状态信息已经可用。
xhr.onreadystatechange = function() {
if (xhr.readyState === 2) { ...
你不能使用Javascript进行PING操作。我创建了一个Java servlet,如果存活则返回一个10x10像素的绿色图像,如果死亡则返回一个红色图像。https://github.com/pla1/Misc/blob/master/README.md