如何检查客户端 JavaScript 中的端口可用性?

Posted

技术标签:

【中文标题】如何检查客户端 JavaScript 中的端口可用性?【英文标题】:How to check port availability in client-side JavaScript? 【发布时间】:2012-04-10 17:05:00 【问题描述】:

如果端口被防火墙或路由器禁用,是否可以在 javascript(在浏览器中)检测?

【问题讨论】:

什么样的Javascript?在浏览器中?在服务器上?什么样的港口?用于收听或连接?本地还是远程? 我想在浏览器中检测它。例如端口 843。 我有一个 flash 策略服务器,但是如果端口 843 不可用,那么我不想加载 flash 小程序。 【参考方案1】:

不,使用纯 javascript 这是不可能的(除了向特定端口发出 http 请求,但这些结果意义不大),但是您可以做的是从外部(换句话说,您的服务器)检查特定的端口是开放的。另一种选择是使用 java 小程序或浏览器插件,如果您真的需要它,它可以为您执行此操作,在这种情况下,如果您有必要,您可能可以移植各种开源工具体验这些。但是请注意,这并不完全是用户友好的。 (无论哪种方式,如果你能描述你需要这个的确切场景将会很有用,因为可能有一个完全不同的解决方案。)

【讨论】:

我有一个 flash 策略服务器,但是如果端口 843 不可用,那么我不想加载 flash 小程序。 在这种情况下,我建议您加载 Flash 小程序,如果它无法运行,则对您的页面进行回调,然后将反馈提供给用户(在这种情况下,它与 Flash 功能有关)而不是javascript,这是不可能的)(而且我不知道在flash中什么是可能的,什么是不可能的。)。【参考方案2】:

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

在使用 javascript 时,必须停留在 HTTP 的边界内。

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

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

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

【讨论】:

我有一个 flash 策略服务器,但是如果端口 843 不可用,那么我不想加载 flash 小程序。【参考方案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>

【讨论】:

这提示我查看此方法是否适用于我在尝试 ping 另一端可能没有侦听器运行的端口时遇到的问题。问题是,当没有监听器时,即使将 xhr 请求包装在 try/catch 中,Chrome 也总是会记录错误。这不是杀手,但仍然很丑陋。通过删除成功和错误块并处理完整块中的响应,就像您在此处所做的那样,我们避免了控制台消息!我仍然可以通过异步调用来做到这一点。感谢您的代码。

以上是关于如何检查客户端 JavaScript 中的端口可用性?的主要内容,如果未能解决你的问题,请参考以下文章

使用特定端口检查服务器上的状态

如何检查远程IP和端口是不是可用?

检查带有端口的ip是不是可用?

有没有办法检查 PHP 范围内的可用端口?

在将套接字与端点绑定之前如何找到可用端口?

如何检查客户端是不是通过 C++ 中的 Winsock 断开连接?