Javascript: проверить, находится ли сервер в сети?

Какой самый быстрый способ проверить, подключен ли мой сервер через JavaScript?

Я пробовал следующий AJAX:

function isonline() {
    var uri = 'MYURL'
    var xhr = new XMLHttpRequest();
    xhr.open("GET",uri,false);
    xhr.send(null);
    if(xhr.status == 200) {
        //is online
        return xhr.responseText;
    }
    else {
        //is offline
        return null;
    }   
}

Проблема в том, что он никогда не возвращается, если сервер отключен. Как установить таймаут, чтобы, если он не возвращается через определенное время, я могу предположить, что он отключен?

Ответ 1

XMLHttpRequest не работает в кросс-домене. Вместо этого я загрузил бы крошечный <img>, который вы ожидаете быстро вернуться, и посмотрите событие onload:

function checkServerStatus()
{
    setServerStatus("unknown");
    var img = document.body.appendChild(document.createElement("img"));
    img.onload = function()
    {
        setServerStatus("online");
    };
    img.onerror = function()
    {
        setServerStatus("offline");
    };
    img.src = "http://myserver.com/ping.gif";
}

Изменить: Очистка моего ответа. Решение XMLHttpRequest возможно в том же домене, но если вы просто хотите проверить, находится ли сервер в сети, решение загрузки img является самым простым. Там нет необходимости возиться с таймаутами. Если вы хотите, чтобы код выглядел как синхронный, вот вам какой-то синтаксический сахар:

function ifServerOnline(ifOnline, ifOffline)
{
    var img = document.body.appendChild(document.createElement("img"));
    img.onload = function()
    {
        ifOnline && ifOnline.constructor == Function && ifOnline();
    };
    img.onerror = function()
    {
        ifOffline && ifOffline.constructor == Function && ifOffline();
    };
    img.src = "http://myserver.com/ping.gif";        
}

ifServerOnline(function()
{
    //  server online code here
},
function ()
{
    //  server offline code here
});

Ответ 2

Здесь, как я достиг проверки доступности сервера с помощью Fetch для управления запросом и AbortController для обработки тайм-аута в приложении Node.js.

function checkServer(url, timeout) {
  const controller = new AbortController();
  const signal = controller.signal;
  const options = { mode: 'no-cors', signal };
  return fetch(url, options)
    .then(setTimeout(() => { controller.abort() }, timeout))
    .then(response => console.log('Check server response:', response.statusText))
    .catch(error => console.error('Check server error:', error.message));
}

Ответ 3

Используйте XMLHttpRequest, а затем проверьте, не сработало ли оно. Не уверен, что это будет работать в разных доменах.

Ответ 4

Сделайте вызов ajax, и его результат покажет.

Ответ 5

Была такая же проблема, построено хакерское решение:

http://ruthere.co/ https://github.com/glennzw/ruthere

Пример:

var url = "https://stackoverflow.com";
var newImg = new Image;
newImg.src = "http://ruthere.co/u/" + url;
console.log("Checking " + url)

newImg.onload = function(){
    console.log(this.width);
    if (newImg.height == 200) {
        console.log("Stackoverflow is up!");
    } else {
        console.log("Stackoverflow broke :(");
    }
}