Javascript:检查服务器是否在线?

IT技术 javascript
2021-03-14 08:58:30

通过 JavaScript 检查我的服务器是否在线的最快方法是什么?

我尝试了以下 AJAX:

function isonline() {
    var uri = 'MYURL'
    var xhr = new XMLHttpRequest();
    xhr.open("GET",uri,false);
    xhr.send(null);
    if(xhr.status == 200) {
        //is online
        return xhr.responseText;
    }
    else {
        //is offline
        return null;
    }   
}

问题是,如果服务器离线,它永远不会返回。如何设置超时,以便如果它在一段时间后没有返回,我可以假设它处于离线状态?

5个回答

XMLHttpRequest跨域不起作用。相反,我会加载一个<img>你希望很快回来并观看onload事件的小文件:

function checkServerStatus()
{
    setServerStatus("unknown");
    var img = document.body.appendChild(document.createElement("img"));
    img.onload = function()
    {
        setServerStatus("online");
    };
    img.onerror = function()
    {
        setServerStatus("offline");
    };
    img.src = "http://myserver.com/ping.gif";
}

编辑: 清理我的答案。XMLHttpRequest同域解决方案是可以的,但是如果只是想测试一下服务器是否在线,img加载解决方案最简单。没有必要搞乱超时。如果你想让代码看起来像是同步的,这里有一些语法糖给你:

function ifServerOnline(ifOnline, ifOffline)
{
    var img = document.body.appendChild(document.createElement("img"));
    img.onload = function()
    {
        ifOnline && ifOnline.constructor == Function && ifOnline();
    };
    img.onerror = function()
    {
        ifOffline && ifOffline.constructor == Function && ifOffline();
    };
    img.src = "http://myserver.com/ping.gif";        
}

ifServerOnline(function()
{
    //  server online code here
},
function ()
{
    //  server offline code here
});
@gurehbgui - 用 CSS 隐藏它。例如:img.style.display = "none";
2021-04-22 08:58:30
@gilly3,img如果请求的图片被浏览器缓存了,使用方式会不会有错误的结果?
2021-04-23 08:58:30
很好找到,但如果我没记错的话,您必须实际将其附加到 DOM,因为如果您不这样做,并非所有浏览器都会加载它。编辑:您可能想要使用,onerror因为这将在图像不存在时执行:jsfiddle.net/8ZP9r
2021-05-04 08:58:30
如果我错了,请纠正我,但是当我们向其他服务器发送请求时,除非我们知道他们服务器中图像的地址,否则它会失败对吧..?他们可以随时删除图像......我不明白使用图像有什么好处,因为如果我们控制服务器,我们可以发送跨域 XMLHttpRequest。
2021-05-04 08:58:30
@pimvdb - 不错!很好的onerror建议!我会更新我的答案。
2021-05-11 08:58:30

下面是我如何使用 Fetch 来管理请求并使用 AbortController 来处理 Node.js 应用程序中的超时来检查服务器可用性。

function checkServer(url, timeout) {
  const controller = new AbortController();
  const signal = controller.signal;
  const options = { mode: 'no-cors', signal };
  return fetch(url, options)
    .then(setTimeout(() => { controller.abort() }, timeout))
    .then(response => console.log('Check server response:', response.statusText))
    .catch(error => console.error('Check server error:', error.message));
}

使用XMLHttpRequest,然后检查它是否失败。不确定这是否可以跨域工作。

进行 ajax 调用,其结果将说明问题。

2021-05-16 08:58:30

添加到gilly3 答案

在实践中,我发现需要使用document.body.appendChild 相当慢的.

尽管问题是关于纯 JavaScript 的,但使用一些 HTML 会使该解决方案更快。

所以我把这段代码留在这里给任何寻求速度的人。

<html>
<head>
    <title>Some page</title>
</head>

<body>
  <img src="https://myserver.com/ping.gif"  onload="pageOnline()" onerror="pageOffline()">

  <script>


  function pageOnline() {
    // Online code
  }

  function pageOffline() {
    // Offline code
  }
</script>
</body>
</html>

您可以设置另一个setTimeout函数以在更短的时间内(例如 5 秒)重定向调用 pageOffline,那么您将不会被卡住 21 秒。那 21 秒实际上是个人浏览器的超时时间,因此我们无法更改以提供帮助。
2021-05-01 08:58:30
简单的解决方法,谢谢。如果服务器宕机,运行 pageOffline 函数需要时间。在谷歌云服务器上需要 21 秒。
2021-05-12 08:58:30