programing

자바스크립트에서 서버를 ping할 수 있습니까?

cafebook 2023. 8. 11. 22:35
반응형

자바스크립트에서 서버를 ping할 수 있습니까?

원격 서버가 온라인 상태인지 확인해야 하는 웹 앱을 만들고 있습니다.명령줄에서 실행하면 페이지 로드가 전체 60초로 증가합니다(8개 항목의 경우 더 많은 항목에 따라 선형으로 확장됨).

저는 사용자 쪽에서 핑을 하는 길을 가기로 결정했습니다.이렇게 하면 페이지를 로드하고 내용을 검색하는 동안 "서버가 온라인 상태" 데이터를 기다리도록 할 수 있습니다.

위의 질문에 대한 답을 알고 있거나 제 페이지를 빠르게 불러올 수 있는 해결책을 알고 있는 사람이 있다면, 저는 분명히 감사합니다.

교묘하게 해서 이 을 찾았습니다.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 repo를 만들었습니다.

https://github.com/jdfreder/pingjs

업데이트 4: 이 구현은 더 이상 신뢰할 수 없는 것 같습니다.사람들은 또한 크롬이 더 이상 모든 것을 지원하지 않는다고 보고하고 있습니다.net::ERR_NAME_NOT_RESOLVED오류. 누군가 다른 해결책을 확인할 수 있다면 수락된 답으로 넣겠습니다.

Ping은 ICMP이지만 원격 서버에 열려 있는 TCP 포트가 있으면 다음과 같이 수행할 수 있습니다.

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
  }

}

다음을 시도할 수 있습니다.

내용이 있든 없든 서버에 ping.dll을 올려놓습니다. Javascript에 아래와 같이 하십시오.

<script>
    function ping(){
       $.ajax({
          url: 'ping.html',
          success: function(result){
             alert('reply');
          },     
          error: function(result){
              alert('timeout/error');
          }
       });
    }
</script>

Javascript에서 직접 "ping"할 수 없습니다.몇 가지 다른 방법이 있을 수 있습니다.

  • 아약스
  • isReachable에서 Java 애플릿 사용
  • ping할 서버 사이드 스크립트 작성 및 AJAX를 사용하여 서버 사이드 스크립트와 통신
  • 플래시(작업 스크립트)에서 ping을 수행할 수도 있습니다.

브라우저 Javascript에서 일반 ping을 수행할 수는 없지만 원격 서버에서 이미지를 로드하는 등 원격 서버가 활성 상태인지 확인할 수 있습니다.로드가 실패할 경우 -> 서버가 다운됩니다.

온로드 이벤트를 사용하여 로드 시간을 계산할 수도 있습니다.다음은 온로드 이벤트 사용 방법의 입니다.

웹 소켓 솔루션을 사용하는 중...

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

업데이트: 이 솔루션은 주요 브라우저에서 더 이상 작동하지 않습니다.onerror호스트가 존재하지 않는 IP 주소인 경우에도 콜백이 실행됩니다.

요청을 신속하게 유지하려면 ping의 서버 측 결과를 캐시하고 ping 파일 또는 데이터베이스를 몇 분마다 업데이트합니다.cron을 사용하여 8개의 ping으로 셸 명령을 실행하고 출력을 파일에 쓸 수 있습니다. 그러면 웹 서버가 이 파일을 사용자 보기에 포함합니다.

여기에 많은 미친 대답들이 있습니다. 특히 CORS에 대해서요.

http HEAD 요청을 수행할 수 있습니다(예: GET이지만 페이로드는 없습니다).https://ochronus.com/http-head-request-good-uses/ 을 참조하십시오.

비행 전 점검은 필요하지 않습니다. 이전 버전의 사양 때문에 혼란이 발생했습니다. 교차 출발지 HEAD 요청에 비행 점검이 필요한 이유는 무엇입니까?를 참조하십시오.

그래서 당신은 jQuery 라이브러리를 사용하는 위의 답변을 사용할 수 있지만 (말하지 않았습니다)

type: 'HEAD'

--->

<script>
    function ping(){
       $.ajax({
          url: 'ping.html',
          type: 'HEAD',
          success: function(result){
             alert('reply');
          },     
          error: function(result){
              alert('timeout/error');
          }
       });
    }
</script>

물론 바닐라 js나 dojo 같은 것도 사용할 수 있습니다.

표준 ping의 문제는 보안과 트래픽의 이유로 통과하지 못하는 ICMP라는 것입니다.그것이 실패를 설명할 수도 있습니다.

는 TCP 기반의 1.9 Ruby TCP를 있었습니다.ping.rbRuby 1.9+로 실행됩니다..1.8.7 설곳복만하됩면니다.방금 홈 라우터에 ping을 실행하는 것을 확인했습니다.

서버가 "존재"하는지 확인하려는 경우 다음을 사용할 수 있습니다.

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

서버가 존재하는지 여부를 나타내는 참/거짓 표시가 반환됩니다.

응답 시간을 원하는 경우 다음과 같이 약간 수정할 수 있습니다.

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

사용법은 사소한 것입니다.

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

또는:

var responseInMillis = ping("example.com");
alert(responseInMillis);
const ping = (url, timeout = 6000) => {
  return new Promise((resolve, reject) => {
    const urlRule = new RegExp('(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]');
    if (!urlRule.test(url)) reject('invalid url');
    try {
      fetch(url)
        .then(() => resolve(true))
        .catch(() => resolve(false));
      setTimeout(() => {
        resolve(false);
      }, timeout);
    } catch (e) {
      reject(e);
    }
  });
};

다음과 같이 사용:

ping('https://stackoverflow.com/')
  .then(res=>console.log(res))
  .catch(e=>console.log(e))

당신이 어떤 버전의 루비를 실행하고 있는지는 모르겠지만, 자바스크립트 대신 루비를 위한 ping을 구현해 본 적이 있습니까?http://raa.ruby-lang.org/project/net-ping/

'no-response'를 사용하면 응답에 정보가 포함되지 않지만 지연 시간(서툰 2.0 사용)으로 인해 지연됩니다. 그러나 응답에 'response.status == 0' 및 'response'가 포함되어 있으면 됩니다.type == opaque', ping 성공.인터넷 연결을 끊거나 존재하지 않는 웹 사이트에 ping을 시도하면 'fetch()'에서 오류가 발생합니다.

예: js 코드:

async function pingUrl(url){
  try{
    var result = await fetch(url, {
      method: "GET",
      mode: "no-cors",
      cache: "no-cache",
      referrerPolicy: "no-referrer"
    });
    console.log(`result.type: ${result.type}`);
    console.log(`result.ok: ${result.ok}`);
    return result.ok;
  }
  catch(err){
      console.log(err);
  }
  return 'error';
}

유용한 링크: https://github.com/whatwg/fetch/issues/1140

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

만약 당신이 이것을 노드와 함께 실행한다면 구글이 다운되지 않는 한 그것은 200개의 콘솔 로그가 될 것입니다.

DOS ping을 실행할 수 있습니다.다음을 사용하여 JavaScript에서 exe 명령을 실행합니다.

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

이것이 요구된 것입니까, 아니면 제가 뭔가를 놓치고 있는 것입니까?

그냥 대체합니다.

file_get_contents

와 함께

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

그 모든 것보다 훨씬 쉬울 수도 있습니다.당신의 페이지를 로드하고 다른 웹 페이지 활동을 시작하기 위해 일부 외국 페이지의 가용성 또는 내용을 확인하려면, 당신은 이와 같은 javascript와 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
  }
}
?>

<html>
  mypage html content
  ...

<script>
var stopmelater= setInterval("getforeignurl('?urlget=doesntmatter')", 2000);

function getforeignurl(url){
  var handle= browserspec();
  handle.open('GET', url, false);
  handle.send();
  var returnedPageContents= handle.responseText;
  // parse page contents for what your looking and trigger javascript events accordingly.
  // use handle.open('GET', url, true) to allow javascript to continue executing. must provide a callback function to accept the page contents with handle.onreadystatechange()
}
function browserspec(){
  if (window.XMLHttpRequest){
    return new XMLHttpRequest();
  }else{
    return new ActiveXObject("Microsoft.XMLHTTP");
  }
}

</script>

그 정도면 됐다.

트리거된 Javascript에는 clear가 포함되어야 합니다.간격(나중에 멈춤)

그게 당신에게 효과가 있는지 알려주세요.

제리.

당신은 당신의 웹 페이지에서 PHP를 사용해 볼 수 있습니다...다음과 같은 것:

<html><body>
<form method="post" name="pingform" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<h1>Host to ping:</h1>
<input type="text" name="tgt_host" value='<?php echo $_POST['tgt_host']; ?>'><br>
<input type="submit" name="submit" value="Submit" >
</form></body>
</html>
<?php

$tgt_host = $_POST['tgt_host'];
$output = shell_exec('ping -c 10 '. $tgt_host.');

echo "<html><body style=\"background-color:#0080c0\">
<script type=\"text/javascript\" language=\"javascript\">alert(\"Ping Results: " . $output . ".\");</script>
</body></html>";

?>

테스트되지 않았기 때문에 오타 등이 있을 수 있습니다.하지만 효과가 있을 거라고 확신합니다.개선될 수도 있습니다...

언급URL : https://stackoverflow.com/questions/4282151/is-it-possible-to-ping-a-server-from-javascript

반응형