如何使用JavaScript ping IP地址

use*_*885 9 javascript latency ping

我想运行一个JavaScript代码来ping 4个不同的IP地址,然后检索这些ping请求的丢包和延迟,并在页面上显示它们.

我该怎么做呢?

Pis*_*3.0 19

你不能从JS做到这一点.你能做的是:

 client --AJAX-- yourserver --ICMP ping-- targetservers
Run Code Online (Sandbox Code Playgroud)

向服务器发出AJAX请求,然后为您ping目标服务器,并在AJAX结果中返回结果.

可能的警告:

  • 这告诉您目标服务器是否可以从服务器ping,而不是从用户的客户端ping
    • 所以客户端将无法测试其LAN的主机
    • 但是你不应该让主机检查服务器内部网络上的主机(如果存在)
    • 某些主机可能会阻止某些主机的流量,而不会阻止其
  • 你需要限制每台机器的ping数:
    • 避免AJAX请求超时
    • 当你一直在ping他们的网站时,一些网站运营商可能会非常沮丧
  • 资源
    • 长时间运行的HTTP请求可能会遇到服务器的最大连接限制,请检查它的高度
    • 许多尝试一次ping的用户可能会产生可疑的流量(所有ICMP都没有)
  • 并发性 - 您可能希望至少将上/下状态池化/缓存几秒钟,以便希望ping同一目标的多个客户端不会启动大量的ping


Den*_*s G 5

我能想到的唯一方法是从外部服务器加载例如图像文件。当加载失败时,您“知道”服务器没有响应(您实际上不知道,因为服务器可能只是阻止了您)。

看看这个示例代码,看看我的意思:

 /*note that this is not an ICMP ping - but a simple HTTP request
    giving you an idea what you could do . In this simple implementation it has flaws
    as Piskvor correctly points out below */
    function ping(extServer){
     var ImageObject = new Image();
     ImageObject.src = "http://"+extServer+"/URL/to-a-known-image.jpg"; //e.g. logo -- mind the caching, maybe use a dynamic querystring
     if(ImageObject.height>0){
       alert("Ping worked!");
     } else {
       alert("Ping failed :(");
     }

}
Run Code Online (Sandbox Code Playgroud)

  • 这不是 ping,而是 HTTP 请求(因此是 TCP/IP)。此外,如果目标不运行 HTTP 服务器,请求将需要 *loooong* 时间超时;另外,加载是异步的 - 除非图像已经在缓存中,如果在设置 `src` 后立即检查 ImageObject.height 将返回 0;如果它在缓存中 * 是 *,它将返回“Ping 工作”,无论目标是否已启动。http://en.wikipedia.org/wiki/Ping (7认同)
  • **警告:** 以上将缓存。确保在 URL 末尾附加一些独特的内容。此外,单独的 IP/域也适用于图像 `src`:`"http://" + ipOrHost + "?pingedat=" + new Date().getTime();`。 (3认同)