主机在专用网络上扫描

时间:2014-07-22 09:33:12

标签: java multithreading networking

我试图列出本地WiFi网络上的所有可用设备。为此,我使用简单的ICMP回声技术来检查设备是否已连接。问题是扫描整个子网所需的时间。我在后续扫描之间使用7毫秒的等待时间。 我的问题是,为了这个目的,我可以使用Java多线程,每个线程可以独立工作来扫描不同的段吗?会有任何链接层限制吗?谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

我刚才写了一些内容,它会扫描本地网络中的所有可用设备,然后扫描每个端口以查看它是否也是打开的。这是可用的here

由于它有点长,不好解释我是如何做到的。

首先创建一个类似的类:

public class AddressWorker implements Runnable
{
    private String address;

    public AddressWorker(String address, Vector<String> validAddresses) { this.address = address; }

    public void run()
    {
        //Your existing code that uses ICMP to listen for a device
        //if the address responds add it to valid addresses
    }
}

由于runnables的功能与线程类似,因此我们将使用它们。

Vector<String> allRespondedAddress = new Vector(256, 256);
ExecutorService addressExecutor = Executors.newCachedThreadPool();
while (list all ip addresses)
{
    addressExecutor.execute(new AddressWorker(nextAddress, allRespondedAddresses));
}

addressExecutor.awaitTermination(some time);

CachedThreadPool将作为线程运行添加到其中的每个runnable。它将自动分配和优化资源(例如,如果一个线程正在等待,而另一个线程需要继续工作,它将向前移动可用线程,而其他线程等待)。在我的CPU上,它会在大约30秒内扫描子网上的所有256个地址和每个地址的所有65536个端口。我觉得我的完整代码有点太长了,无法发布在这里,但它的所有内容都非常容易访问并对我发布的链接发表了评论。我不是网络用户,所以我担心我无法帮助你处理链接层限制,因为我不知道它们是什么。

我希望这能让你朝着正确的方向前进。