【问题标题】:How do you get host's broadcast address of the default network adapter? Java您如何获取默认网络适配器的主机广播地址?爪哇
【发布时间】:2015-03-24 17:01:05
【问题描述】:

Java中如何获取默认网络适配器的主机广播地址?

【问题讨论】:

    标签: java networking


    【解决方案1】:

    试试这个:

    Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
    while (interfaces.hasMoreElements()) 
    {
        NetworkInterface networkInterface = interfaces.nextElement();
        if (networkInterface.isLoopback())
            continue;    // Do not want to use the loopback interface.
        for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) 
        {
            InetAddress broadcast = interfaceAddress.getBroadcast();
            if (broadcast == null)
                continue;
    
            // Do something with the address.
        }
    }
    

    【讨论】:

    • 我如何知道哪个广播是默认网络适配器?该循环在我的一台机器上返回大约 4 个广播地址。
    • 我不认为有任何方法可以确定 Java 中的默认适配器。可能无法为此编写独立于 O/S 的代码,这可能就是为什么在 Java 中没有方法可以做到这一点。
    【解决方案2】:

    与预期答案的想法相同,但使用 Streams
    (没有检查它是否具有性能或任何其他优势)。

    所有可用广播地址的流:

    public static Stream<InetAddress> getBroadcastAddresses(boolean ignoreLoopBack)
    throws SocketException {
        return NetworkInterface.networkInterfaces()
            .filter(n -> !ignoreLoopBack || notLoopBack(n))
            .map(networkInterface ->
                networkInterface.getInterfaceAddresses()
                    .stream()
                    .map(InterfaceAddress::getBroadcast)
                    .filter(Objects::nonNull)
            )
            .flatMap(i -> i); // stream of streams to a single stream
    }
    

    第一个找到的广播地址的 Optional(可以为空):

    public static Optional<InetAddress> getBroadcastAddress(boolean ignoreLoopBack) 
    throws SocketException {
        return NetworkInterface.networkInterfaces()
                .filter(n -> !ignoreLoopBack || notLoopBack(n))
                .map(networkInterface ->
                        networkInterface.getInterfaceAddresses()
                            .stream()
                            .map(InterfaceAddress::getBroadcast)
                            .filter(Objects::nonNull)
                            .findFirst()
                )
                .filter(Optional::isPresent)
                .map(Optional::get)
                .findFirst();
    }
    

    帮助方法避免在流上执行的 lambda 中出现异常:

    private static boolean notLoopBack(NetworkInterface networkInterface) {
        try {
            return !networkInterface.isLoopback();
        } catch (SocketException e) {
            // should not happen, but if it does: throw RuntimeException
            throw new RuntimeException(e);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-04
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 2012-07-06
      • 2010-09-18
      相关资源
      最近更新 更多