2012-03-27 177 views
6

是否可以在JavaScript中(在浏览器中)检测端口是否被防火墙或路由器禁用?如何检查客户端JavaScript中的端口可用性?

+2

什么样的Javascript?在浏览器中?在服务器上?什么样的端口?聆听或连接?本地或远程? – Thilo 2012-03-27 07:17:49

+1

我想在浏览器中检测到它。例如端口843. – 2012-03-27 07:19:29

+0

我有一个Flash策略服务器,但如果端口843不可用,那么我不想加载Flash小程序。 – 2012-03-27 07:33:57

回答

4

您只能看到预期响应是否存在。

使用javascript时,必须保持HTTP的边界。

当然,您可以在服务器的任何端口上发送Ajax请求,并查看是否出现错误。如果你想检查当前机器的端口,那么可能在“localhost:843”上发送请求可能会有所帮助。

但错误可能是其他原因,并不一定是防火墙问题。

我们需要更多的信息来帮助你。

+0

我有一个Flash策略服务器,但如果端口843不可用,那么我不想加载Flash小程序。 – 2012-03-27 07:34:41

4

不,用纯javascript这是不可能的(除了向特定端口发出http请求,但这些结果意味着什么),然而你可以做的是从外部(换句话说你的服务器)检查是否特定的端口是打开的。另一种选择是使用java applet或浏览器插件,如果你真的需要它,真的需要它,在这种情况下,你可能会使用各种开源工具,如果你有必要的经验的话。但请注意,这不完全是用户友好的。 (无论哪种方式,如果你需要描述确切的场景,你可能需要使用它,因为这可能会有一个完全不同的解决方案)。

+0

我有一个Flash策略服务器,但如果端口843不可用,那么我不想加载Flash小程序。 – 2012-03-27 07:56:42

+0

在这种情况下,我会建议您加载Flash小程序,并在页面无法正常工作时进行回调,然后向用户提供反馈(在这种情况下,它是关于Flash功能的,而不是JavaScript,可能)(我不知道闪光灯是什么,不可能闪光灯)。 – 2012-03-27 08:13:42

3

如果您足够灵活地使用jQuery,请参阅此Answer by me。这不仅将检查端口的可用性,而且还将检查成功响应代码200是否来自远程(或任何,我的意思是它也支持跨域)服务器。此处也提供解决方案。我将在这里检查端口843.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
     <script type="text/javascript" src="jquery-1.7.2-min.js"></script> 
    </head> 
    <body> 
     <script type"text/javascript"> 
      var isAccessible = null; 
      function checkConnection() { 
    /*make sure you host a helloWorld HTML page in the following URL, so that requests are succeeded with 200 status code*/ 
       var url = "http://yourserverIP:843/test/hello.html" ; 
       $.ajax({ 
        url: url, 
        type: "get", 
        cache: false, 
        dataType: 'jsonp', // it is for supporting crossdomain 
        crossDomain : true, 
        asynchronous : false, 
        jsonpCallback: 'deadCode', 
        timeout : 1500, // set a timeout in milliseconds 
        complete : function(xhr, responseText, thrownError) { 
         if(xhr.status == "200") { 
          isAccessible = true; 
          success(); // yes response came, execute success() 
         } 
         else { 
          isAccessible = false; 
          failure(); // this will be executed after the request gets timed out due to blockage of ports/connections/IPs 
         } 
        } 
       }); 
      } 
      $(document).ready(function() { 
       checkConnection(); // here I invoke the checking function 
      }); 
     </script> 
    </body> 
</html> 
+0

这提示我看看这个方法是否会应用于我在试图ping一个端口时可能没有监听器的问题。问题是,当没有监听者时,即使在try/catch中包装xhr请求时,Chrome也总是记录错误。不是一个杀手,但仍然很丑。通过删除成功和错误块并处理完整块中的响应,就像在这里所做的那样,我们避免了控制台消息!我仍然可以通过异步调用来做到这一点。感谢代码。 – likestoski 2014-01-30 15:34:50