我正在尝试制作一个应用程序来扫描特定开放端口(5050)范围内的所有 IP,如果它是开放的,则在日志上写入一些消息。
代码如下:
public void run(){
for(int i=0;i<256;i++)
{
Log.d("NetworkScanner","attemping to contact 192.168.1."+i);
try {
Socket socket=new Socket(searchIP+i,5050);
possibleClients.add(searchIP);
socket.close();
Log.d("NetworkScanner"," 192.168.1."+i+" YEAAAHHH");
} catch (UnknownHostException e) {
Log.d("NetworkScanner"," 192.168.1."+i+" unavailable");
} catch (IOException e) {
e.printStackTrace();
}
}
}
编辑:这里有一个新问题:即使在没有打开端口的情况下找到在线主机,扫描过程(for循环)也会在移动到下一个之前停留很长时间。扫描每个主机也需要相当长的时间!
唷,最终的解决方案是使用默认构造函数创建一个 Socket 对象,然后为主机创建 InetAddr 对象,然后使用套接字 api 的 Connect(InetAddr,timeout) 函数,超时时间为毫秒(大约 300 毫秒),该函数会扫描每个只需 300 毫秒或更短时间即可扫描 IP(少于 200 毫秒可能会出错),多线程并行扫描使其扫描范围内的所有 IP 仅需 5 秒。
最佳答案
当没有抛出 Exception
时,您将跳出循环。
您需要删除break;
解决您的新问题:
当然是慢了。你期待什么?您正在尝试与子网中的每个 IP 建立连接,这需要时间。看来您只是想弄清楚网络上有哪些设备可用,因此您可以通过查看 this 来稍微减少时间。回答。他正在使用接受超时值的 isReachable
方法中的构建。仍然需要一些时间,但时间不会那么长。
关于java - android套接字连接后卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15793259/