【发布时间】:2013-04-03 16:45:01
【问题描述】:
我正在尝试制作一个应用程序来扫描特定开放端口 (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 循环)也会在移动到下一个之前卡住很长时间。扫描每个主机也需要相当长的时间!
最后的解决方案是使用默认构造函数创建一个 Socket 对象,然后为主机创建 InetAddr 对象,然后使用套接字 api 的 Connect(InetAddr,timeout) 函数,超时以毫秒(约 300 毫秒)为单位,扫描每个ip 在 300 毫秒或更短的时间内(少于 200 毫秒可能会出错)和多线程并行扫描使得扫描范围内的所有 IP 最快 5 秒..
【问题讨论】:
-
Phew 最终的解决方案是使用默认构造函数创建一个 Socket 对象,然后为主机创建 InetAddr 对象,然后使用套接字 api 的 Connect(InetAddr,timeout) 函数,超时以毫秒为单位(大约300 毫秒)在 300 毫秒或更短的时间内扫描每个 ip(少于 200 毫秒可能会出错)和多线程并行扫描使得扫描范围内的所有 IP 最快 5 秒。感谢大家的回复
标签: java android sockets ip port