我正在尝试实现server / clint java应用程序。一旦服务器套接字在端口3232上侦听,我希望客户端自动浏览网络并扫描子网中的每个IP地址,直到找到在端口3232上运行的另一个实例(服务器),然后报告它的IP地址,以便我可以在应用程序中使用它来设置套接字连接目标IP地址。
我被建议使用exec(nmap)扫描网络以查找开放端口,但我想在没有安装nmap的系统上部署此应用程序。
如果我理解正确,我必须进行for循环迭代主机,最后找到端口3232打开的正确主机。
public static ArrayList<InetAddress> checkHosts(int socket, int timeout)
{
ArrayList<InetAddress> al = new ArrayList<InetAddress>();
try
{
byte[] buffer = {1};
DatagramSocket ds = new DatagramSocket(socket);
ds.setSoTimeout(timeout);
DatagramPacket dp;
InetAddress local = InetAddress.getLocalHost();
String subnet = getSubnet(local);
System.out.println(subnet);
for(int i = 1; i <= 255; i++)
{
String host = subnet + i;
try {
ds.send(new DatagramPacket(buffer, 1, InetAddress.getByName(host), 3232));
ds.receive(dp = new DatagramPacket(buffer, 1));
if(dp.getPort() == socket && !dp.getAddress().equals(local))
al.add(dp.getAddress());
} catch(Exception e) {
continue;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return al;
}