J'ai trouvé quelqu'un qui réalise cela avec une utilisation très astucieuse de l'objet natif Image
.
D'après leur source, voici la fonction principale (elle dépend d'autres parties de la source mais vous avez l'idée).
function Pinger_ping(ip, rappel) {
if(!this.inUse) {
this.inUse = true;
this.rappel = rappel
this.ip = ip;
var _that = this;
this.img = new Image();
this.img.onload = function() {_that.bien();};
this.img.onerror = function() {_that.bien();};
this.debut = new Date().getTime();
this.img.src = "http://" + ip;
this.timer = setTimeout(function() { _that.mauvais();}, 1500);
}
}
Cela fonctionne sur tous les types de serveurs que j'ai testés (serveurs web, serveurs FTP et serveurs de jeu). Cela fonctionne également avec les ports. Si quelqu'un rencontre un cas d'utilisation qui échoue, veuillez poster dans les commentaires et je mettrai à jour ma réponse.
Mise à jour : Le lien précédent a été supprimé. Si quelqu'un trouve ou implémente ce qui précède, veuillez commenter et je l'ajouterai à la réponse.
Mise à jour 2 : @trante a eu la gentillesse de fournir un jsFiddle.
http://jsfiddle.net/GSSCD/203/
Mise à jour 3 : @Jonathon a créé un dépôt GitHub avec la mise en œuvre.
https://github.com/jdfreder/pingjs
Mise à jour 4 : Il semble que cette mise en œuvre ne soit plus fiable. Des personnes signalent également que Chrome ne le prend plus en charge du tout, renvoyant une erreur net::ERR_NAME_NOT_RESOLVED
. Si quelqu'un peut vérifier une solution alternative, je la mettrai comme réponse acceptée.