자바스크립트에서 서버를 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.rb
Ruby 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
'programing' 카테고리의 다른 글
PowerShell: 문자열과 일치하지 않는 경우 오류 종료 코드 반환 (0) | 2023.08.11 |
---|---|
터미널을 통해 OS X의 adb에 액세스할 수 없습니다. "명령을 찾을 수 없습니다." (0) | 2023.08.11 |
도커가 macOS에서 기본적으로 Linux/amd64 플랫폼을 사용하도록 강제 설정 (0) | 2023.08.11 |
sufficialize.js 타임스탬프가 DATTIME이 아닙니다. (0) | 2023.08.11 |
동기화 시 MariaDB / Sequetize SQL 구문 오류 발생 (0) | 2023.08.11 |