Java 扫描外部主机';s端口

Java 扫描外部主机';s端口,java,network-programming,port-scanning,Java,Network Programming,Port Scanning,我正在用java编写一个端口扫描器作为一个教育练习,我遇到了一个问题。 当我扫描本地计算机上的端口时,我的程序运行良好,但是当我尝试扫描外国计算机上的端口时,过程就停止了。以下是我的扫描方法的代码: public void scan(InetAddress ad, int start, int end){ for(int i=start; i<=end; i++){ try{ socket = new Socket(ad, i);

我正在用java编写一个端口扫描器作为一个教育练习,我遇到了一个问题。 当我扫描本地计算机上的端口时,我的程序运行良好,但是当我尝试扫描外国计算机上的端口时,过程就停止了。以下是我的扫描方法的代码:

public void scan(InetAddress ad, int start, int end){
    for(int i=start; i<=end; i++){
        try{
            socket = new Socket(ad, i);
            System.out.println("Port "+i+"is open");
        }catch(Exception e){
            System.out.println("Port "+i+"is not open");
        }
    } 
}

有人能告诉我本地机器上的扫描端口和外部主机上的扫描端口是否有很大区别吗?或者我的代码只是出了点问题?

调用套接字构造函数的方式会立即建立连接。问题是,如果连接超时,您将不得不等待一段时间(操作系统默认)。您应该按照以下方式进行操作:

Socket s = new Socket();
s.connect(new InetSocketAddress(ad, i), timeout);

另一个原因是它为什么会超时。这是因为您的计算机可能位于某种防火墙后面,并且与您的代码示例无关。

您调用套接字构造函数的方式将立即建立连接。问题是,如果连接超时,您将不得不等待一段时间(操作系统默认)。您应该按照以下方式进行操作:

Socket s = new Socket();
s.connect(new InetSocketAddress(ad, i), timeout);

另一个原因是它为什么会超时。这是因为您的计算机可能位于某种防火墙之后,并且与您的代码示例无关。

如果成功打开套接字,则需要关闭它们。如果成功打开套接字,则需要关闭它们。