[javascript] Javascript에서 서버를 핑 (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 저장소를 만들었습니다.

https://github.com/jdfreder/pingjs

업데이트 4 :이 구현이 더 이상 신뢰할 수없는 것처럼 보입니다. 사람들은 또한 Chrome이 더 이상 모든 것을 지원하지 않아 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.html 을 넣고 자바 스크립트에서 다음과 같이하십시오.

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


답변

자바 스크립트에서는 직접 “핑”할 수 없습니다. 몇 가지 다른 방법이있을 수 있습니다.

  • 아약스
  • isReachable 과 함께 Java 애플릿 사용
  • Ping을 수행하고 AJAX를 사용하여 서버 측 스크립트와 통신하는 서버 측 스크립트 작성
  • 플래시로 핑할 수도 있습니다 (액션 스크립트)

답변

브라우저 Javascript에서 정기적으로 핑을 수행 할 수는 없지만 원격 서버에서 이미지를로드하는 등의 방법으로 원격 서버가 활성 상태인지 확인할 수 있습니다. 로딩이 실패하면-> 서버 다운.

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


답변

웹 소켓 솔루션을 사용하여 피칭 …

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


답변

요청을 빠르게 유지하려면 핑의 서버 측 결과를 캐시하고 2 분마다 (또는 원하는대로) 핑 파일 또는 데이터베이스를 업데이트하십시오. cron을 사용하여 8 핑으로 쉘 명령을 실행하고 출력을 파일에 쓸 수 있습니다. 웹 서버는이 파일을보기에 포함시킵니다.