回答:
私は、ネイティブ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);
}
}
これは、私がテストしたすべてのタイプのサーバー(Webサーバー、FTPサーバー、およびゲームサーバー)で機能します。また、ポートで動作します。失敗したユースケースに遭遇した場合は、コメントに投稿してください。回答を更新します。
更新:以前のリンクが削除されました。誰かが上記を見つけたり実装したりした場合は、コメントしてください。答えに追加します。
更新2:@tranteはjsFiddleを提供するのに十分良かったです。
http://jsfiddle.net/GSSCD/203/
更新3:@Jonathonが実装を含むGitHubリポジトリを作成しました。
https://github.com/jdfreder/pingjs
Update 4:この実装は信頼性がないように見えます。人々はまた、Chromeがすべてをサポートしなくなったため、net::ERR_NAME_NOT_RESOLVEDエラーをスローしたと報告しています。誰かが別の解決策を検証できれば、私はそれを受け入れられた回答とします。
...。しかし、onerrorは「良い」ので、これはそれが反応したと言います
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("example.com", "77", function(m){ console.log("It took "+m+" miliseconds."); }).....例の呼び出し
onreadystatechangeまだ発生していません。つまり、状態が変化したときにピックアップするコールバックが必要です。
test.zzzzzzzzz、 "77"、function(m){console.log( "It +" m + "miliseconds。");})は、 "67ミリ秒かかりました。"と出力します。ping(stackoverflow.com、 "80"、function(m){console.log( "Itかかりました" + m + "ミリ秒。");})CORS-Error:developer.mozilla.org/en-US/docs/Web/ HTTP / CORS / Errors /… リモートコンピュータがオンラインかどうかをこのコードで確認する方法がわかりません。
あなたはこれを試すことができます:
ping.htmlをサーバーに配置し、コンテンツを含めても含めなくても、JavaScriptでは次のように実行します。
<script>
function ping(){
$.ajax({
url: 'ping.html',
success: function(result){
alert('reply');
},
error: function(result){
alert('timeout/error');
}
});
}
</script>
JavaScriptで直接「ping」することはできません。他のいくつかの方法があるかもしれません:
ブラウザのJavascriptでは通常のpingを実行できませんが、リモートサーバーから画像を読み込むなどして、リモートサーバーが稼働しているかどうかを確認できます。ロードに失敗した場合->サーバーがダウンしています。
onload-eventを使用して、読み込み時間を計算することもできます。次に、onloadイベントの使用例を示します。
pingコマンドを利用することを検討するかもしれません。それは産業の強みです。または、さまざまな種類のハートビートチェックを使用して、ホストが実行されているかどうかを監視するあらゆる種類の無料/オープンソースアプリがあります。
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);
}
isUp();呼び出しはonopenイベントハンドラ内にあるべきではありませんか?:)
isUp();する必要があります。または、明らかにwebsocket-y以外のポートを追加することでそれを軽減します。
リクエストを高速に保つには、pingのサーバー側の結果をキャッシュし、数分ごとにpingファイルまたはデータベースを更新します(または正確にしたい場合)。cronを使用して、8つのpingでシェルコマンドを実行し、出力をファイルに書き込むことができます。Webサーバーはこのファイルをビューに含めます。
見ようとしているのがサーバーが「存在する」かどうかである場合は、以下を使用できます。
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;
}
これにより、サーバーが存在するかどうかのtrue / falseの指示が返されます。
応答時間が必要な場合は、少し変更するだけで済みます。
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);
No 'Access-Control-Allow-Origin' header is present on the requested resource. Originで成功のコールバックが呼び出されることはありません
標準的なpingの問題は、それらがICMPであることです。多くの場所では、セキュリティとトラフィックの理由で通過できません。それは失敗を説明するかもしれません。
Ruby 1.9より前のping.rbバージョンにはTCPベースのがあり、これはRuby 1.9以降で実行されます。1.8.7のインストールから別の場所にコピーするだけです。ホームルーターに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や道場なども使用できます...
実行しているRubyのバージョンがわかりませんが、JavaScriptの代わりにRubyのpingを実装してみましたか?http://raa.ruby-lang.org/project/net-ping/
ping server.com構文だけを使用するように変更しました。
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)
});;
これをノードで実行すると、googleがダウンしていない限り、コンソールログ200になります。
const ping = (url, timeout = 6000) => {
return new Promise((reslove, 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(() => reslove(true))
.catch(() => reslove(false));
setTimeout(() => {
reslove(false);
}, timeout);
} catch (e) {
reject(e);
}
});
};
次のように使用します:
ping('https://stackoverflow.com/')
.then(res=>console.log(res))
.catch(e=>console.log(e))
以下を使用して、javaScriptからDOS ping.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!";
}
それよりもずっと簡単かもしれません。ページをロードしたい場合は、外部ページの可用性またはコンテンツを確認して、他のWebページアクティビティをトリガーする場合、次のようにJavaScriptとPHPのみを使用して実行できます。
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
}
}
?>
<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には、clearInterval(stopmelater)が含まれている必要があります
それがうまくいくか教えてください
ジェリー
あなたはあなたのウェブページで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>";
?>
これはテストされていないため、タイプミスなどがあるかもしれませんが、うまくいくと確信しています。改善することもできます...
"/?cachebreaker="+new Date().getTime();、必要に応じてimg srcの最後にa を追加することで回避できます。