원격 서버가 온라인인지 여부를 확인 해야하는 웹 응용 프로그램을 만들고 있습니다. 명령 줄에서 실행하면 페이지로드가 최대 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 핑으로 쉘 명령을 실행하고 출력을 파일에 쓸 수 있습니다. 웹 서버는이 파일을보기에 포함시킵니다.