Я нашел человека, который выполняет это с очень умным использованием собственного 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
. Если кто-то может проверить альтернативное решение, я поставлю это как принятый ответ.