我有 FOR Statement ,它使用不同的IP地址调用方法(范围从10.0.0.1到10.0.0.255,因为我没有IP扫描程序)。此方法是Future Callable并返回布尔值true或false。 Method的功能是基本上做一个 Socket ,用给定的IP& amp;连接到这个Socket。端口+超时,并根据给定的IP地址返回true或false,端口是否打开。
我的计划: 我正在尝试检查连接到同一WIFI网络的设备是否有开放端口(SSH端口),这样我就可以在不知道它的IP地址的情况下通过SSH连接到该设备。我的想法是获取Android设备的私有IP地址,检查它是否等于公共专用IP地址(例如10.0.0。*)并扫描它的IP范围(从10.0.0.1-255)打开SSH端口(22)。
TODO:
我在这里使用了端口扫描程序的代码:Socket Port Scanner在这个问题中,如果固定IP地址上的端口是打开的,则Future方法返回true或false。然后将此方法的结果添加到Future Boolean List Array中。然后查询,用户可以看到在这个固定的IP地址上打开了多少个端口。
我对它进行了修改,因此方法正在扫描固定端口的多个IP地址,然后添加IP地址,SSH端口是打开的,未来的布尔列表数组。除了socket.connect(new InetSocketAddress(ip, port), timeout);
总是返回true之外,这个工作正常。我试着查看它为什么会这样做的代码,但我找不到答案。如果你有任何想法我怎么能让Socket返回false,当IP地址上的给定端口没有打开时,请告诉我。在此先感谢。
这里我调用套接字方法(portIsOpen
),如果它返回true,我将发送到Method的IP地址附加到我的 Stringbuilder possibleIPAddresses
。通过这种方式,我可以列出所有打开端口的IP地址,然后再连接到它们。
//Initialisiert Variablen für den Port Prüfer
public StringBuilder possibleIPAddress = new StringBuilder("");
final ExecutorService es = Executors.newFixedThreadPool(50);
final int timeout = 500;
final List<Future<Boolean>> futures = new ArrayList<>();
//Code for querying IP Adress here.
//Checking all IP-Addresses from 10.0.0.1-10.0.0.255 for open SSH Port
String ip = "";
for (int x=1;x<=10;x++) {
ip = "10.0.0."+x;
//Should return true if port on IP-Address is open, but returns true everytime..help?
if (futures.add(portIsOpen(es, ip, 22, timeout))) {
possibleIPAddress.append(ip).append("\n");
}
es.shutdown();
}
以下是端口扫描程序的代码(与端口扫描程序问题相同)
public static Future<Boolean> portIsOpen(final ExecutorService es, final String ip, final int port, final int timeout) {
return es.submit(new Callable<Boolean>() {
@Override public Boolean call() {
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(ip, port), timeout);
socket.close();
return true;
} catch (Exception ex) {
return false;
}
}
});
}
答案 0 :(得分:0)
您的portIsOpen()
方法返回Future
,其结果是您永远不会得到的,因此您的方法根本不会返回任何内容,因为它永远不会被调用。当且仅当Future
的结果为true
时,您才需要添加到可能的IP地址列表中。
注意,如果出现异常,你也会泄漏套接字。使用try-with-resources
语法来解决此问题。