我试图列出本地WiFi网络上的所有可用设备。为此,我使用简单的ICMP回声技术来检查设备是否已连接。问题是扫描整个子网所需的时间。我在后续扫描之间使用7毫秒的等待时间。 我的问题是,为了这个目的,我可以使用Java多线程,每个线程可以独立工作来扫描不同的段吗?会有任何链接层限制吗?谢谢你的帮助!
答案 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个端口。我觉得我的完整代码有点太长了,无法发布在这里,但它的所有内容都非常容易访问并对我发布的链接发表了评论。我不是网络用户,所以我担心我无法帮助你处理链接层限制,因为我不知道它们是什么。
我希望这能让你朝着正确的方向前进。