Я нашел кого-то, кто выполняет это с очень умным использованием нативного 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-серверы и игровые серверы). Это также работает с портами. Если кто-то сталкивается с случаем использования, который терпит неудачу, пожалуйста, отправьте в комментариях, и я обновлю свой ответ.
Обновление : Предыдущая ссылка была удалена. Если кто-то найдет или реализует вышеизложенное, прокомментируйте, и я добавлю его в ответ.
Обновление 2 : @trante был достаточно хорош, чтобы предоставить jsFiddle.
http://jsfiddle.net/GSSCD/203/
Обновление 3 : @Jonathon создал репозиторий GitHub с реализацией.
https://github.com/jdfreder/pingjs
Обновление 4 : похоже, что эта реализация больше не является надежной. Люди также сообщают, что Chrome больше не поддерживает все это, выдавая net::ERR_NAME_NOT_RESOLVEDошибку. Если кто-то может проверить альтернативное решение, я поставлю это как принятый ответ.
"/?cachebreaker="+new Date().getTime();в конец img src, если это необходимо.