如何检查客户端的网络/防火墙上的端口是否打开?

IT技术 java javascript jquery jakarta-ee jsonp
2021-03-06 07:37:15

这最终通过 jQuery AJAX(和 JSONP)的“超时”属性解决。看我自己的回答!

请参阅更新的部分,我也尝试过使用小程序。如果您可以提供带有小程序实现的解决方案,将毫不犹豫地接受您的回答。

我正在使用基于 Java 的 Web 应用程序。我的要求是检查特定端口(例如 1935)在客户端是否打开或被阻止。我已经实现了一个“jsonp”(为什么是“jsonp”?我发现通过 AJAX 的“http”请求不能用于浏览器的 corssdomain 的“同源策略”)AJAX 调用到我的一个包含特定端口的服务器。如果服务器返回xhr.status == 200端口是开放的。这是一个缺点,我不能让执行流等待(同步),直到调用完成。这是我正在使用的 JavaScript 函数。

任何替代解决方案(必须是客户端的东西必须与我的应用程序并行,请不要建议 python/php/其他语言)也是受欢迎的。谢谢你的时间。

function checkURL() {

    var url = "http://10.0.5.255:1935/contextname" ;
    var isAccessible = false;

    $.ajax({
        url: url,
        type: "get",
        cache: false,
        dataType: 'jsonp',
        crossDomain : true,
        asynchronous : false,
        jsonpCallback: 'deadCode',
        complete : function(xhr, responseText, thrownError) {
            if(xhr.status == "200") {
                isAccessible = true;
                alert("Request complete, isAccessible==> " + isAccessible); // this alert does not come when port is blocked
            }
        }
    });

    alert("returning isAccessible=> "+ isAccessible); //this alert comes 2 times before and after the AJAX call when port is open
    return isAccessible;

}

function deadCode() {
    alert("Inside Deadcode"); // this does not execute in any cases
}

-------------------------------------------------- - - - -更新 - - - - - - - - - - - - - - - - - - - - - ---------------

我已经尝试过 Java Applet(感谢 Y Martin 的建议)。这在 appletviewer 中运行良好。但是当我在 HTML 页面中添加小程序时,它给出了易受攻击的结果。从某种意义上说,当我更改选项卡或调整浏览器大小portAvailable时,打印消息中的 值会发生变化。

小程序代码:

import java.applet.Applet;
import java.awt.Graphics;
import java.net.InetSocketAddress;
import java.net.Socket;

public class ConnectionTestApplet extends Applet {
    private static boolean portAvailable;
    public void start() {
        int delay = 1000; // 1 s
        try {
            Socket socket = new Socket();
                /*****This is my tomcat5.5 which running on port 1935*************/
                /***I can view it with url--> http://101.220.25.76:1935/**********/
            socket.connect(new InetSocketAddress("101.220.25.76", 1935), delay);
            portAvailable = socket.isConnected();
            socket.close();
            System.out.println("init() giving--->  " + portAvailable);
        }
        catch (Exception e) {
            portAvailable = false;
            System.out.println("init() giving--->  " + portAvailable);
            System.out.println("Threw error---> " + e.getMessage());
        }

    }
    public void paint(Graphics g) {
        System.out.println("Connection possible---> " + portAvailable);
        String msg = "Connection possible---> " + portAvailable;
        g.drawString(msg, 10, 30);
    }
}

这是我的 HTML 页面(我将它托管在同一台计算机上,使用不同的 Tomcat 6,该 Tomcat 6 在端口 9090 上运行。我可以使用 url ---> 查看此页面http://101.220.25.76:9090/test/):

<html>
<body>
        <applet code="ConnectionTestApplet" width=300 height=50>
        </applet>
</body>
</html>

我是如何阻塞和打开 1935 端口的?

我已经为端口 1935 的入站和出站创建了防火墙规则。我通过禁用/启用这两个规则来检查端口 1935 打开/阻止的情况。

这是我的SSCCE现在请帮助我:)

6个回答

明白了!!!我已经用 JSONP 和 jQuery AJAX 调用解决了我的问题。我发现了timeoutjQuery AJAX属性,当端口被阻塞或打开时,我的代码可以流畅地执行。这是未来访问者的解决方案。感谢所有回答者的贡献。

<!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() {
                var url = "http://101.212.33.60:1935/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, esecute 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>
我同意你的看法。我应该看看我从 JavaScript 和 Java 经验中了解到的“超时”想法到 jQuery API 中,而不是遵循其他答案的路径......我希望我也了解它。
2021-04-29 07:37:15
伟大的 !我几乎可以肯定这个“超时”选项是通过 JS“setTimeout”实现的
2021-05-01 07:37:15
我建议您从小程序代码中清除您的问题,以供将来的读者使用
2021-05-05 07:37:15

我认为您不了解 JSONP 的用例,并且无法使用它来测试开放端口。http://en.wikipedia.org/wiki/JSONP

如果您需要客户端解决方案,可以使用 websockets,但这仅适用于 chrome 或 ff 等新浏览器。否则请求执行 ping 的服务器端脚本。例如 - 使用 curl 脚本:curl 和 ping - 如何检查网站是启动还是关闭?

我忘了用 java 标记它。我不能用curl那是PHP吧?如果我错了,请原谅我。任何其他解决方案?
2021-04-21 07:37:15
是的,明白你的意思。看到Java代码将在服务器中执行。对?我将永远在那里打开端口。但这是客户端的问题,端口可能在其网络中被阻塞。在这些情况下,我不能运行除 JavaScript 之外的任何东西。
2021-04-26 07:37:15
尝试运行一台服务器,该服务器可以访问应检查端口的所有系统。然后客户端可以在端口 80 (http) 上连接到此服务器,并获取有关其他服务器的信息(端口可用性)。服务器就像端口信息的代理。
2021-05-08 07:37:15
嗨 Soc,看,我会设置另一台服务器。这将保存端口信息。行。现在客户端将调用此服务器以获取端口 80 上的信息。它会发现,是的,该特定代理服务器上的端口 1935 已打开但是我需要在客户端网络中找到它是否打开
2021-05-17 07:37:15
在 Java 中,您可以使用 URL 或 Socket 类进行更好的网络连接:stackoverflow.com/questions/3584210/...
2021-05-18 07:37:15

这是一个 Java 代码作为 Applet 来测试服务器/端口连接:

import java.io.*;
import java.net.*;

public class ConnectionTestApplet extends Applet {
    public void start() {
        boolean portAvailable = false;
        int delay = 1000; // 1 s
        try {
            Socket socket = new Socket();
            socket.connect(new InetSocketAddress("server.domain.com", 1935), delay);
            portAvailable = socket.isConnected();
            socket.close();
        } catch (UnknownHostException uhe) {
            uhe.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
        System.out.println("Connection possible: " + portAvailable);
    }
}

您仍然必须从小程序中获取信息才能对结果执行其他操作。最简单的方法是重定向浏览器,感谢getAppletContext().showDocument(url)

嗨马丁,我已经尝试过这个并用结果更新了问题,你能看看吗?
2021-05-14 07:37:15

可以使用 flash 组件代替小程序。使用 ActionCcript 中可用的 Socket 类,可以打开从闪存到服务器端口的 tcp 连接,以检查其是否打开。但是根据 Flash Player 版本,需要在打开套接字的服务器上放置一个策略文件。

嗨阿里,我不做闪存文件。有的话可以分享一下吗?我认为这些应该是最好的方法。
2021-05-05 07:37:15
嗨,我已经用结果更新了问题,你能看看吗?
2021-05-20 07:37:15

看一下这个:

http://blog.andlabs.org/2010/12/port-scanning-with-html5-and-js-recon.html

使用 JS-Recon,您可以使用 javascript 进行端口扫描。您可以简单地将其指向您的本地 IP 地址。我相信它可以通过将网络套接字/cors 连接到任意目标 ip/socket 并测量超时来工作。这不是一个完美的方法,但这最终可能是 javascript 的限制。

如果您可以在 java applet/flash 应用程序中执行此操作,那么最终可能会更好,因为它们具有较低级别的访问权限。

我发誓我以前没有听说过。并感谢最后一段中的好主意。我当然会看看这些 API。非常感谢你。如果您有兴趣了解我是如何解决我的问题的,请参阅我自己的答案!
2021-05-10 07:37:15