我正在制作一个需要检查远程服务器是否在线的网络应用程序。当我从命令行运行它时,我的页面加载时间长达 60 秒(对于 8 个条目,它将随着更多条目线性扩展)。
我决定走用户端ping的路线。这样,我可以加载页面并让他们在浏览我的内容时等待“服务器在线”数据。
如果有人对上述问题有答案,或者他们知道让我的页面快速加载的解决方案,我将不胜感激。
我正在制作一个需要检查远程服务器是否在线的网络应用程序。当我从命令行运行它时,我的页面加载时间长达 60 秒(对于 8 个条目,它将随着更多条目线性扩展)。
我决定走用户端ping的路线。这样,我可以加载页面并让他们在浏览我的内容时等待“服务器在线”数据。
如果有人对上述问题有答案,或者他们知道让我的页面快速加载的解决方案,我将不胜感激。
我发现有人通过非常巧妙地使用本机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放在有或没有任何内容的服务器上,在 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 事件的示例。