当前位置:  开发笔记 > 编程语言 > 正文

是否可以从Javascript ping服务器?

如何解决《是否可以从Javascriptping服务器?》经验,为你挑选了8个好方法。

我正在制作一个Web应用程序,要求我检查远程服务器是否在线.当我从命令行运行它时,我的页面加载速度达到了整整60秒(对于8个条目,它会随着更多线性线性扩展).

我决定在用户​​端进行ping操作.这样,我可以加载页面,让他们在浏览我的内容时等待"服务器在线"数据.

如果有人对上述问题有答案,或者他们知道解决方案以保持我的页面加载速度快,我肯定会感激.



1> Chuck Calleb..:

我发现有人通过非常巧妙地使用本机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错误.如果有人可以验证替代解决方案,我会将其作为接受的答案.


这就是我一直在使用的.然而,它确实存在一个缺陷,即"图像"被缓存.当我最初ping一个给定的IP时,我得到304毫秒 - 但是如果我再次ping它而没有重新加载页面,我会得到2毫秒.这可以通过在必要时附加一个`"/?cachebreaker ="+ new Date().getTime();`到img src的末尾来避免.
更多测试显示这完全不可靠.
@Jonathon创建的Ping API将成功ping通所有内容.不存在的站点和随机字符.
Ping API实际上总是因为错误而失败.但是,如果目标URL表示图像,它会触发onload,这太棒了!绕过CORS检查.

2> 小智..:

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(“花费了” + m +“毫秒。”);})... example调用

3> jerjer..:

你可以试试这个:

在有或没有任何内容的服务器上放置ping.html,在javascript上执行如下操作:



@dlchambers不是因为CORS而是因为跨域poilicy.CORS允许服务器指定原点,并且浏览器必须支持它.所以它更像是一个跨域问题.

4> Eugene..:

你不能在javascript中直接"ping".可能还有其他一些方法:

阿贾克斯

使用带有isReachable的java applet

编写一个服务器端脚本,用于ping和使用AJAX与您的serversidescript进行通信

您也可以ping一下flash(actionscript)



5> Epeli..:

您无法在浏览器Javascript中进行常规ping操作,但您可以通过例如从远程服务器加载图像来查明远程服务器是否处于活动状态.如果加载失败 - >服务器关闭.

您甚至可以使用onload-event计算加载时间.这是一个如何使用onload事件的示例.


不幸的是,我正在ping的服务器不是Web服务器.他们是游戏服务器.

6> 小智..:

为了快速保持您的请求,请缓存ping的服务器端结果,并每隔几分钟更新一次ping文件或数据库(或者您希望它是否准确).您可以使用cron运行带有8个ping的shell命令并将输出写入文件,Web服务器将此文件包含在您的视图中.



7> acron..:

使用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);
}



8> Ohad..:

如果您要查看的是服务器是否“存在”,则可以使用以下命令:

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);

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有