Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 专用网络上的主机扫描_Java_Multithreading_Networking - Fatal编程技术网

Java 专用网络上的主机扫描

Java 专用网络上的主机扫描,java,multithreading,networking,Java,Multithreading,Networking,我正在尝试列出本地WiFi网络上的所有可用设备。为此,我使用简单的ICMP回送技术来检查设备是否连接。问题是扫描整个子网所需的时间。我在后续扫描之间使用7毫秒的等待时间。 我的问题是,我是否可以使用Java多线程来实现这一目的,其中每个线程将独立地扫描不同的段?是否存在任何链接层约束?谢谢你的帮助 我不久前写了一篇文章,扫描本地网络中所有可用的设备,然后扫描每个端口,看看它是否也打开了。这是可用的 因为有点长,我来解释一下我是怎么做的 首先创建一个类,如下所示: public class Add

我正在尝试列出本地WiFi网络上的所有可用设备。为此,我使用简单的ICMP回送技术来检查设备是否连接。问题是扫描整个子网所需的时间。我在后续扫描之间使用7毫秒的等待时间。
我的问题是,我是否可以使用Java多线程来实现这一目的,其中每个线程将独立地扫描不同的段?是否存在任何链接层约束?谢谢你的帮助

我不久前写了一篇文章,扫描本地网络中所有可用的设备,然后扫描每个端口,看看它是否也打开了。这是可用的

因为有点长,我来解释一下我是怎么做的

首先创建一个类,如下所示:

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
    }
}
由于可运行程序的功能类似于线程,因此我们将使用它们

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个端口。我觉得我的完整代码有点太长了,无法在这里发布,但它都非常容易访问,并对我发布的链接进行了评论。我不是networker,因此我恐怕无法帮助您解决链接层约束,因为我不知道它们是什么


我希望这能让您看到正确的方向。

您可以使用线程扫描不同的段,但不能保证加快速度。顺便说一句,为什么要等这么久?我会看看现有的扫描工具是如何做到这一点的。