Answers:
我发现有人通过非常巧妙地使用本机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
更新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(“花费了” + m +“毫秒。”);})打印“花费了67毫秒。” ping(stackoverflow.com,“ 80”,function(m){console.log(“花费了“ + m +”毫秒。”);})给出了CORS错误: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命令运行shell命令并将输出写入文件中,网络服务器会将这个文件包含在您的视图中。
如果您要查看的是服务器是否“存在”,则可以使用以下命令:
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);
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin成功回调从未被调用
标准ping的问题在于它们是ICMP,出于安全和流量方面的原因,很多地方不允许通过。那可以解释失败的原因。
1.9之前的Ruby具有基于TCP的ping.rb,它将与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>
当然,您也可以使用vanilla js或dojo或其他任何方法。
我不知道您运行的是哪个版本的Ruby,但是您是否尝试过为ruby而不是javascript实现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;
}
这是所要的,还是我缺少了什么?
这可能比这简单得多。如果要加载页面,然后检查某些外部页面的可用性或内容以触发其他网页活动,则可以仅使用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 来避免这种情况。