É possível pingar um servidor de JavaScript?

Estou fazendo um aplicativo da web que requer que eu verifique se os servidores remotos estão online ou não. Quando eu o executo a partir da linha de comando, o carregamento da minha página sobe para um total de 60s (para 8 inputs, ele irá escalar linearmente com mais).

Eu decidi ir a rota de ping no final do usuário. Dessa forma, posso carregar a página e apenas esperar que os dados do “servidor estejam on-line” durante a navegação pelo meu conteúdo.

Se alguém tiver a resposta para a pergunta acima, ou se eles souberem uma solução para manter minha página carregada rapidamente, eu definitivamente aprecio isso.

Eu encontrei alguém que faz isso com um uso muito inteligente do object Image nativo.

De sua fonte, esta é a function principal (tem dependencies de outras partes da fonte, mas você tem a idéia).

 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); } } 

Isso funciona em todos os tipos de servidores que eu testei (servidores web, servidores ftp e servidores de jogos). Também funciona com portas. Se alguém encontrar um caso de uso que falhe, poste nos comentários e atualizarei minha resposta.

Atualização : o link anterior foi removido. Se alguém encontrar ou implementar o acima, por favor, comente e eu vou adicioná-lo na resposta.

Atualização 2 : @trante foi legal o suficiente para fornecer um jsFiddle.

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

Atualização 3 : o @Jonathon criou um repository do GitHub com a implementação.

https://github.com/jdfreder/pingjs

Atualização 4 : parece que essa implementação não é mais confiável. As pessoas também informam que o Chrome não oferece mais suporte a todos, net::ERR_NAME_NOT_RESOLVED erro net::ERR_NAME_NOT_RESOLVED . Se alguém puder verificar uma solução alternativa, colocarei isso como a resposta aceita.

você pode tentar isto:

Coloque ping.html no servidor com ou sem qualquer conteúdo, no javascript faça o mesmo conforme abaixo:

  

Você não pode diretamente “ping” em javascript. Pode haver algumas outras maneiras:

  • Ajax
  • Usando um applet java com isReachable
  • Escrevendo um script do lado do servidor que pinga e usa o AJAX para se comunicar com o seu serveridescript
  • Você também pode fazer ping em flash (actionscript)

O ping é ICMP, mas se houver alguma porta TCP aberta no servidor remoto, isso pode ser conseguido assim:

 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 } } 

Você não pode fazer ping regular no navegador Javascript, mas você pode descobrir se o servidor remoto está ativo, por exemplo, carregando uma imagem do servidor remoto. Se o carregamento falhar -> servidor inativo.

Você pode até calcular o tempo de carregamento usando onload-event. Aqui está um exemplo de como usar o evento onload.

Para manter suas solicitações rápidas, armazene em cache os resultados do ping no servidor e atualize o arquivo de ping ou o database a cada dois minutos (ou o quão preciso você desejar). Você pode usar o cron para executar um comando shell com seus 8 pings e gravar a saída em um arquivo, o servidor da Web includeá esse arquivo em sua visualização.

Entrando com uma solução websocket …

 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); } 

O problema com pings padrão é que eles são ICMP, que muitos lugares não deixam passar por razões de segurança e tráfego . Isso pode explicar o fracasso.

O Ruby anterior ao 1.9 tinha um ping.rb baseado em ping.rb , que rodaria com o Ruby 1.9+. Tudo o que você precisa fazer é copiá-lo da instalação do 1.8.7 para outro local. Eu só confirmei que ele seria executado por ping meu roteador doméstico.

Se o que você está tentando ver é se o servidor “existe”, você pode usar o seguinte:

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

Isso retornará uma indicação true / false se o servidor existe.

Se você quiser um tempo de resposta, uma pequena modificação será feita:

 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%20*%20from%20html%20where%20url%3D%22" + encodedURL + "%22&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(); } 

O uso é então trivial:

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

Ou:

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

Há muitas respostas loucas aqui e especialmente sobre CORS –

Você poderia fazer uma solicitação HTTP HEAD (como GET, mas sem payload). Veja https://ochronus.com/http-head-request-good-uses/

NÃO precisa de uma verificação pré-impressão, a confusão é causada por uma versão antiga da especificação, consulte Por que uma solicitação HEAD de origem cruzada precisa de uma verificação pré-impressão?

Então você poderia usar a resposta acima, que está usando a biblioteca jQuery (não disse isso), mas com

 type: 'HEAD' 

—>

  

Claro que você também pode usar baunilha js ou dojo ou qualquer outra coisa …

Eu não sei qual versão do Ruby você está usando, mas você já tentou implementar ping para Ruby ao invés de 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) });; 

se você executar isso com o nó, ele consola o log 200, desde que o google não esteja inativo.

Você pode executar o comando DOS ping.exe a partir do javaScript usando o seguinte:

 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() + "
"; } return input; }

É isso que foi pedido, ou estou faltando alguma coisa?

apenas substitua

 file_get_contents 

com

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

Pode ser muito mais fácil do que tudo isso. Se você quer que sua página carregue, então verifique a disponibilidade ou o conteúdo de alguma página estrangeira para acionar outra atividade de página da web, você pode fazê-lo usando apenas JavaScript e PHP como este.

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 } } ?>  mypage html content ...  

Isso deve resolver.

O javascript acionado deve include clearInterval (stopmelater)

Deixe-me saber se isso funciona para você

Jerry

Você poderia tentar usar o PHP na sua página web … algo como isto:

  

Host to ping:

'>
< ?php $tgt_host = $_POST['tgt_host']; $output = shell_exec('ping -c 10 '. $tgt_host.'); echo " "; ?>

Isto não é testado, por isso pode ter erros de digitação, etc … mas estou confiante de que funcionaria. Poderia ser melhorado também …