我有以下代码检查端口443是否在给定主机中打开。
import java.net.*;
import java.io.IOException;
public class Scan {
public static void main (String[] args) {
String host="put hostname here";
int port=443;
try{
Socket s = new Socket(host,port);
System.out.println("Can listen on port "+port+
" in host "+host+" is open");
} //end try
catch (IOException ex)
{
//remote host is not listening on port 443
System.out.println("Can not listen on port "+port+
" of host "+host);
} //end catch
}
}
我的问题是:如果端口443未在某个主机中打开,这会使我的程序非常慢,因为我需要检查主机组。有没有办法改进代码,使扫描端口443更快,同时保持可靠性?有没有办法使用java编程进行端口扫描而不是使用套接字?
请不要在扫描之前ping不会,因为我连接的主机名已经连接,我只需要检查端口443是打开还是关闭。
答案 0 :(得分:2)
如果您必须扫描一组主机,只需在一个单独的线程中运行每个检查。这将确保一个主机不会阻止您处理其他主机。
长而独立的IO操作是多线程的经典用例。您甚至不必担心计算机上的CPU数量,因为它们在等待网络响应时几乎不会做任何事情。按照其他人的建议添加超时也是一种合理的补充,除了多线程之外还可以使用。