[英]How to ping IP addresses using JavaScript
我想運行一個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 calls()一起使用非常有用,例如,找出哪些是在某些情況下使用最快的服務器或從用戶的互聯網收集一些粗略的統計信息連接速度。
這個小函數只是連接到不存在的URL上的HTTP服務器(預期返回404),然后測量服務器響應HTTP請求的時間,並在累計時間內進行平均和迭代次數。
請求的URL在每次調用時都會被randomely修改,因為我注意到(可能)某些透明代理或緩存機制,在某些情況下偽造結果,提供額外的快速答案(實際上比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");
請注意,我找不到此腳本的結果數字和相應服務器上的ICMP ping之間的簡單核心,盡管HTTP響應時間似乎與ICMP響應時間大致呈指數關系。 這可以通過HTTP請求傳輸的數據量來解釋,這可以根據Web服務器的風格和配置而變化,顯然是服務器本身的速度以及可能的其他原因。
這不是很好的代碼,但我認為它可以幫助並可能激勵其他人。
function ping(url){
new Image().src=url
}
以上ping給定的Url。
通常用於計數器/分析。
它不會遇到客戶端失敗的響應(javascript)
你最接近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 :)
你不能用Javascript PING。 我創建了Java servlet,如果活着則返回10x10像素的綠色圖像,如果死了則返回紅色圖像。 https://github.com/pla1/Misc/blob/master/README.md
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.