Я делаю веб-приложение, которое требует, чтобы я проверил, подключены ли удаленные серверы к сети или нет. Когда я запускаю его из командной строки, загрузка моей страницы достигает целых 60 секунд (для 8 записей он будет линейно масштабироваться с увеличением).

Я решила пройти маршрут пинга на стороне пользователя. Таким образом, я могу загрузить страницу и просто ждать, пока данные «сервер подключен», просматривая мой контент.

Если у кого-нибудь есть ответ на поставленный выше вопрос или если он знает решение, позволяющее быстро загружать мою страницу, я определенно буду благодарен.

Я нашел кого-то, кто выполняет это с очень умным использованием нативного объекта Image.

Из их источника это основная функция (она зависит от других частей источника, но вы поняли идею).

function Pinger_ping(ip, callback) {

  if(!this.inUse) {

    this.inUse = true;
    this.callback = callback
    this.ip = ip;

    var _that = this;

    this.img = new Image();

    this.img.onload = function() {_that.good();};
    this.img.onerror = function() {_that.good();};

    this.start = new Date().getTime();
    this.img.src = "http://"   ip;
    this.timer = setTimeout(function() { _that.bad();}, 1500);

  }
}

Это работает на всех типах серверов, которые я тестировал (веб-серверы, FTP-серверы и игровые серверы). Это также работает с портами. Если кто-то сталкивается с случаем использования, который терпит неудачу, пожалуйста отправьте в комментариях, и я обновлю свой ответ.

ОБНОВЛЕНИЕ : Предыдущая ссылка была удалена. Если кто-то найдет или реализует вышеизложенное, прокомментируйте, и я добавлю его в ответ.

update 2 : @trante был достаточно хорош, чтобы предоставить jsFiddle.

http://jsfiddle.net/GSSCD/203/

Обновление 3 : @Jonathon создал репозиторий GitHub с реализацией.

https://github.com/jdfreder/pingjs

Обновление 4 : похоже, что эта реализация больше не является надежной. Люди также сообщают, что Chrome больше не поддерживает все это, выдавая ошибку net::ERR_NAME_NOT_RESOLVED. Если кто-то может проверить альтернативное решение, я поставлю это как принятый ответ.

вы можете попробовать это:

Put ping.html на сервере с любым содержимым или без него, на javascript сделайте то же самое, что и ниже:

<script>
    function ping(){
       $.ajax({
          url: 'ping.html',
          success: function(result){
             alert('reply');
          },     
          error: function(result){
              alert('timeout/error');
          }
       });
    }
</script>

Пинг ICMP, но если на удаленном сервере есть какой-либо открытый порт TCP, это может быть достигнуто следующим образом:

function ping(host, port, pong) {

  var started = new Date().getTime();

  var http = new XMLHttpRequest();

  http.open("GET", "http://"   host   ":"   port, /*async*/true);
  http.onreadystatechange = function() {
    if (http.readyState == 4) {
      var ended = new Date().getTime();

      var milliseconds = ended - started;

      if (pong != null) {
        pong(milliseconds);
      }
    }
  };
  try {
    http.send(null);
  } catch(exception) {
    // this is expected
  }

}

Вы не можете напрямую «пинговать» в javascript. Возможны несколько других способов:

  • Ajax
  • использованию Java-апплета с isReachable
  • Написание серверного скрипта, который пингует и использует AJAX для связи с вашим серверным скриптом
  • Вы также можете пинговать во flash (actionscript)

Вы не можете выполнять регулярный пинг в браузерном Javascript, но вы можете выяснить, удален ли он сервер жив, например, загружая изображение с удаленного сервера. Если загрузка не удалась — & Gt ; сервер выключен.

Вы даже можете рассчитать время загрузки с помощью события onload. Вот Пример как использовать событие onload.

Чтобы ваши запросы были быстрыми, кэшируйте результаты пинга на стороне сервера и обновляйте файл или базу данных пинга каждые пару минут (или насколько вы хотите, чтобы они были точными). Вы можете использовать cron для запуска команды оболочки с вашими 8 пингами и записи вывода в файл, веб-сервер включит этот файл в ваше представление.

Внедрение с помощью решения для веб-сокетов …

function ping(ip, isUp, isDown) {
  var ws = new WebSocket("ws://"   ip);
  ws.onerror = function(e){
    isUp();
    ws = null;
  };
  setTimeout(function() { 
    if(ws != null) {
      ws.close();
      ws = null;
      isDown();
    }
  },2000);
}

Проблема со стандартными эхо-запросами заключается в том, что они ICMP, которые во многих местах не пропускают по соображениям безопасности и трафика . Это может объяснить неудачу.

Ruby до 1.9 имел TCP-интерфейс ping.rb, который будет работать с Ruby 1.9. Все, что вам нужно сделать, это скопировать его из установки 1.8.7 в другое место. Я только что подтвердил, что он будет работать, пропинговать мой домашний маршрутизатор.

Если вы пытаетесь увидеть, существует ли сервер, вы можете использовать следующее:

function isValidURL(url) {
    var encodedURL = encodeURIComponent(url);
    var isValid = false;

    $.ajax({
      url: "http://query.yahooapis.com/v1/public/yql?q=select * from html where url=""   encodedURL   ""&format=json",
      type: "get",
      async: false,
      dataType: "json",
      success: function(data) {
        isValid = data.query.results != null;
      },
      error: function(){
        isValid = false;
      }
    });

    return isValid;
}

Это вернет истину / ложь, указав, существует ли сервер.

Если вы хотите время отклика, подойдет небольшая модификация:

function ping(url) {
    var encodedURL = encodeURIComponent(url);
    var startDate = new Date();
    var endDate = null;
    $.ajax({
      url: "http://query.yahooapis.com/v1/public/yql?q=select * from html where url=""   encodedURL   ""&format=json",
      type: "get",
      async: false,
      dataType: "json",
      success: function(data) {
        if (data.query.results != null) {
            endDate = new Date();
        } else {
            endDate = null;
        }
      },
      error: function(){
        endDate = null;
      }
    });

    if (endDate == null) {
        throw "Not responsive...";
    }

    return endDate.getTime() - startDate.getTime();
}

Использование будет тривиальным:

var isValid = isValidURL("http://example.com");
alert(isValid ? "Valid URL!!!" : "Damn...");

читатель может неверно истолковать его как сокращение. Другое значение отрывка текста, окруженного

var responseInMillis = ping("example.com");
alert(responseInMillis);

Здесь есть много сумасшедших ответов, особенно о CORS —

Вы можете сделать запрос http HEAD (например, ПОЛУЧИТЬ, но без полезной нагрузки). См. Https://ochronus.com/http-head-request-good-uses/

Это НЕ нуждается в предварительной проверке, путаница из-за старой версии спецификации , см. Почему запрос HEAD для разных источников требует предварительной проверки?

Таким образом, вы можете использовать ответ выше, который использует библиотеку jQuery (не сказал этого), но с

type: 'HEAD'

— & Gt ;

<script>
    function ping(){
       $.ajax({
          url: 'ping.html',
          type: 'HEAD',
          success: function(result){
             alert('reply');
          },     
          error: function(result){
              alert('timeout/error');
          }
       });
    }
</script>

Конечно, вы также можете использовать vanilla js или dojo или что-то еще …

Я не знаю, какую версию Ruby вы используете, но вы пытались реализовать ping для ruby ​​вместо javascript? http://raa.ruby-lang.org/project/net-ping/

let webSite = 'https://google.com/' 
https.get(webSite, function (res) {
    // If you get here, you have a response.
    // If you want, you can check the status code here to verify that it's `200` or some other `2xx`.
    console.log(webSite   ' '   res.statusCode)
}).on('error', function(e) {
    // Here, an error occurred.  Check `e` for the error.
    console.log(e.code)
});;

, если вы запустите это с узлом, он будет поддерживать лог 200, пока Google не выключен.

Вы можете запустить команду DOS ping.exe из javaScript, используя следующую строку:

function ping(ip)
{
    var input = "";
    var WshShell = new ActiveXObject("WScript.Shell");
    var oExec = WshShell.Exec("c:/windows/system32/ping.exe "   ip);

    while (!oExec.StdOut.AtEndOfStream)
    {
            input  = oExec.StdOut.ReadLine()   "<br />";
    }
    return input;
}

Это то, о чем просили, или я что-то упустил?

просто замените

file_get_contents

2 — это число цифр, до которого мы хотим округлить это число.

$ip = $_SERVER['xxx.xxx.xxx.xxx'];
exec("ping -n 4 $ip 2>&1", $output, $retval);
if ($retval != 0) { 
  echo "no!"; 
} 
else{ 
  echo "yes!"; 
}

Это может быть намного проще, чем все это. Если вы хотите, чтобы ваша страница загружалась, то проверьте доступность или содержимое какой-либо внешней страницы, чтобы вызвать другие действия веб-страницы, вы можете сделать это, используя только javascript и php, как это.

yourpage.php

<?php
if (isset($_GET['urlget'])){
  if ($_GET['urlget']!=''){
    $foreignpage= file_get_contents('http://www.foreignpage.html');
    // you could also use curl for more fancy internet queries or if http wrappers aren't active in your php.ini
    // parse $foreignpage for data that indicates your page should proceed
    echo $foreignpage; // or a portion of it as you parsed
    exit();  // this is very important  otherwise you'll get the contents of your own page returned back to you on each call
  }
}
?>

<html>
  mypage html content
  ...

<script>
var stopmelater= setInterval("getforeignurl('?urlget=doesntmatter')", 2000);

function getforeignurl(url){
  var handle= browserspec();
  handle.open('GET', url, false);
  handle.send();
  var returnedPageContents= handle.responseText;
  // parse page contents for what your looking and trigger javascript events accordingly.
  // use handle.open('GET', url, true) to allow javascript to continue executing. must provide a callback function to accept the page contents with handle.onreadystatechange()
}
function browserspec(){
  if (window.XMLHttpRequest){
    return new XMLHttpRequest();
  }else{
    return new ActiveXObject("Microsoft.XMLHTTP");
  }
}

</script>

Это должно сделать это.

Триггерный JavaScript должен включать clearInterval (stopmelater)

Дайте мне знать, если это работает для вас

Джерри

Вы можете попробовать использовать PHP на своей веб-странице … примерно так:

<html><body>
<form method="post" name="pingform" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<h1>Host to ping:</h1>
<input type="text" name="tgt_host" value='<?php echo $_POST['tgt_host']; ?>'><br>
<input type="submit" name="submit" value="Submit" >
</form></body>
</html>
<?php

$tgt_host = $_POST['tgt_host'];
$output = shell_exec('ping -c 10 '. $tgt_host.');

echo "<html><body style="background-color:#0080c0">
<script type="text/javascript" language="javascript">alert("Ping Results: " . $output . ".");</script>
</body></html>";

?>

Это не проверяется, поэтому он может иметь опечатки и т.д … но я уверен, что это будет работать. Можно улучшить тоже …

Не тот ответ, который вы ищете? Просмотрите другие вопросы с тегом . Для разработки ответа Стивена Спилберга я сделал это в таком случае: { *} Выражение задайте свой вопрос Глядя на вывод