Как пинговать IP-адреса с помощью JavaScript - PullRequest
7 голосов
/ 10 февраля 2011

Я хочу запустить код JavaScript, чтобы пропинговать 4 разных IP-адреса, а затем получить потерю пакетов и задержку этих запросов на пинг и отобразить их на странице.

Как мне это сделать?

Ответы [ 7 ]

19 голосов
/ 10 февраля 2011

Вы не можете сделать это из JS.Что вы можете сделать, это:

 client --AJAX-- yourserver --ICMP ping-- targetservers

Сделайте запрос AJAX на ваш сервер, который затем пингует целевые серверы для вас и вернет результат в результате AJAX.

Возможные предупреждения:

  • это говорит о том, могут ли целевые серверы пинговаться с вашего сервера, а не с клиента пользователя
    • , поэтому клиент не сможетдля проверки хостов его локальной сети
    • , но вы не должны позволять хосту проверять хосты во внутренней сети сервера, если таковые существуют
    • некоторые хосты могут блокировать трафик с определенных хостов, а не другие
  • вам нужно ограничить количество пингов на машину:
    • , чтобы избежать задержки запроса AJAX
    • некоторые операторы сайта могут очень расстроиться, когда вы продолжаете пинговатьих сайты все время
  • ресурсы
    • длительные запросы HTTP могут работать с максимальным пределом подключения вашего сервера, проверьте, насколько оно высоко
    • многие пользователи, пытающиеся пропинговать сразу, могут генерировать подозрительно выглядящий трафик (все ICMP и ничего больше)
  • параллелизм - вы можете захотеть объединить / кэшировать состояние вверх / вниз на несколько секундпо крайней мере, такна нескольких клиентах, желающих пропинговать одну и ту же цель, не запускается поток пингов
4 голосов
/ 10 февраля 2011

Единственный способ, о котором я могу подумать - это загрузить, например, файл изображения с внешнего сервера. Когда эта загрузка не удается, вы «знаете», что сервер не отвечает (вы на самом деле не знаете, потому что сервер может просто блокировать вас).

Взгляните на этот пример кода, чтобы понять, что я имею в виду:

 /*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 голосов
/ 20 февраля 2015

Меня вдохновил последний комментарий, поэтому я написал этот небольшой фрагмент кода.

Это своего рода «HTTP-пинг», который, я думаю, может быть весьма полезным для использования вместе с вызовами XMLHttpRequest ()Например, чтобы выяснить, какой из серверов является самым быстрым в использовании, или собрать некоторую приблизительную статистику по скорости интернет-соединения пользователя.

Эта небольшая функция просто подключается к серверу HTTP на несуществующемURL-адрес (который должен возвращать 404), а затем измеряет время, пока сервер отвечает на запрос HTTP, и выполняет усреднение по накопленному времени и количеству итераций.

Запрошенный URL-адресмодифицируется случайным образом при каждом вызове, так как я заметил, что (возможно) некоторые прозрачные прокси или механизмы кэширования, в некоторых случаях приводящие к подделке, дают очень быстрые ответы (на самом деле быстрее, чем ICMP, что несколько странно).

Остерегайтесьиспользуйте полные доменные имена, которые соответствуют настоящему HTTP-серверу!Результаты будут отображаться в элементе тела с идентификатором «result», например:

<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 на соответствующих серверах, хотя время отклика HTTP, по-видимому, примерно экспоненциально от времени отклика ICMP.Это может быть объяснено количеством данных, передаваемых через HTTP-запрос, которые могут варьироваться в зависимости от вида и конфигурации веб-сервера, очевидно, скорости самого сервера и, возможно, других причин.

Это не оченьхороший код, но я подумал, что он может помочь и, возможно, вдохновить других.

1 голос
/ 24 июня 2014

Самое близкое, что вы собираетесь получить на эхо-запрос в JS - это использование 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-статусов и сделать вывод таким, каким вы хотите, с описаниями и т. Д., Чтобы он выглядел лучше. Больше проверки статуса http http чем пинг, но та же идея на самом деле. Вы всегда можете зациклить его несколько раз, чтобы сделать его более похожим на пинг:)

1 голос
/ 12 июня 2013
function ping(url){
 new Image().src=url
}

Выше пингов данный URL.Обычно используется для счетчиков / аналитики.Он не будет сталкиваться с ошибочными ответами клиенту (javascript)

0 голосов
/ 17 апреля 2017

Можно ли пинговать сервер из Javascript?

Следует проверить вышеуказанное решение. Довольно гладко.

Не мой, очевидно, но хотел прояснить это.

0 голосов
/ 18 января 2016

Вы не можете PING с Javascript.Я создал Java-сервлет, который возвращает зеленое изображение размером 10x10 пикселей, если оно живое, и красное изображение, если оно мертво.https://github.com/pla1/Misc/blob/master/README.md

...