【问题标题】:How to resolve a Bonjour domain name with JmDNS如何使用 JmDNS 解析 Bonjour 域名
【发布时间】:2012-12-31 14:53:31
【问题描述】:

作为我正在开发的应用程序的一部分,我需要能够解析与 Bonjour hostname 对应的正确 IP。

例如,我得到了jack.local,需要将其解析为192.168.1.141,这是与jack 关联的IP 地址。

我一直在梳理 JmDNS API,我能找到的最多的是允许在类型和名称已知的情况下解析服务的方法。但是,我根本找不到任何可以解析主机名的东西。

所以我错过了什么吗?真的没有办法使用 JmDNS 解析主机名吗?

【问题讨论】:

  • 我知道这是可能的,我去年做过,但我无法为你得到正确的答案,我不在家,无法告诉你怎么做,我回家后会回来的。
  • @RaphMclee 太棒了!期待。
  • @Jake Raph 的解决方案对您有用吗?您是否设法使用设置的主机名而不是 IP 访问您的 android 设备?
  • 您找到解决方案了吗?

标签: java android bonjour hostname jmdns


【解决方案1】:

如果您需要使用 JmDNS 从 IP 地址中找出 LAN 中的远程主机名,您可以使用以下代码。如果您需要从主机名映射到 IP,那么您可以解析所有子网 IP 的主机名以构建缓存。如果您的本地名称解析支持本地 Bonjour 名称,您可以使用 InetAddress.getByName(hostname).getHostAddress()。

    final JmDNSImpl jmdns = new JmDNSImpl(null, null);
    final HostInfo hostInfo = HostInfo.newHostInfo(InetAddress.getByName("192.168.1.78"), jmdns, null);
    System.out.println("MDNS hostname (Bonjour): " + hostInfo.getName());
    System.out.println("DNS hostname: " + hostInfo.getInetAddress().getHostName());
    System.out.println("IP address: " + hostInfo.getInetAddress().getHostAddress());
    jmdns.close();

【讨论】:

    【解决方案2】:

    使用 jmdns,您可以收听服务。订阅使用功能

    jmdns = JmDNS.create();
    jmdns.addServiceListener(String type, ServiceListener listener);
    

    一旦 jmdns 找到服务,ServiceListener 就会收到通知。监听器具有三个公共函数:

    serviceResolved(ServiceEvent event)
    serviceRemoved(ServiceEvent event)
    serviceAdded(ServiceEvent event)
    

    与所有人一起,您将获得ServiceEvent。现在调用event.getInfo().getHostAddresses()获取Host所有地址的数组。

    如果你想解决你必须调用的服务

    jmdns.requestServiceInfo(event.getType(), event.getName(), 1);
    

    在 serviceAdded 方法中。

    看看:Quick Tutorial

    【讨论】:

    • 这假设您知道服务的类型。再一次,正如我在问题中指出的那样,我正在寻找一种方法来找到给定主机的 IP。所以它需要按主机名搜索...
    • 你有没有试过在方法addServiceListener(String type, ServiceListener listener)中使用主机名作为Service类型;
    • ServiceResolved 永远不会被调用!!问题可能出在哪里?
    • 'serviceResolved' 仅在您开始解析服务时调用。首先只调用“serviceAdded”方法。您必须手动解析服务。
    • 虽然在 serviceAdded 中调用 jmdns.requestServiceInfo(event.getType(), event.getName());,但我始终无法解决服务问题,可能是什么问题? (通过wireshark,我确信它会发送解析请求)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多