我正在尝试制作一个应用程序,扫描特定打开端口(5050)范围内的所有ip,如果打开则在LOG上写一些消息。
继承人代码:
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循环)也会长时间停留,然后再转到下一个。扫描每个主机也需要相当长的时间!
Phew最后的解决方案是使用默认构造函数创建一个Socket对象,然后为主机创建InetAddr对象,然后使用套接字api的Connect(InetAddr,timeout)函数,以超时(毫秒)(大约300毫秒)扫描每个ip只需300毫秒或更短时间(少于200毫秒可能会出错)并且多线程并行扫描使得扫描范围内的所有IP的速度最快可达5秒。
答案 0 :(得分:2)
当没有抛出Exception
时,你正在脱离循环。
您需要删除break;
解决您的新问题:
当然很慢。你有什么期望?您正在尝试与子网中的每个IP建立连接,这需要时间。您似乎只是想弄清楚网络上有哪些设备可用,因此您可以通过查看this答案来缩短时间。他正在使用isReachable
方法构建,该方法接受超时值。它仍然需要一些时间,但不是那么多时间。
答案 1 :(得分:0)
删除“break;”...它会停止迭代。