0

我正在尝试制作一个应用程序来扫描特定开放端口(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 秒。

4

2 回答 2

2

Exception抛出no 时,您将跳出循环。

你需要删除break;


要解决您的新问题:

当然,它很慢。你期待什么?您正在尝试与子网中的每个 IP 建立连接,这需要时间。您似乎只是在尝试找出网络上可用的设备,因此您可以通过查看答案来稍微减少时间。他正在使用接受超时值的内置isReachable方法。这仍然需要一些时间,但不会花费太多时间。

于 2013-04-03T16:51:00.580 回答
0

删除“break;”...它会停止迭代。

于 2013-04-03T16:50:51.843 回答