如何使用JmDNS解析Bonjour域名

8
作为我正在开发的应用的一部分,我需要能够解析与Bonjour 主机名 对应的正确IP。
例如,我得到了jack.local,需要将其解析为与jack相关联的192.168.1.141 IP地址。
我一直在查找JmDNS API,最多只能找到允许解析已知类型和名称服务的方法。然而,我根本找不到任何可以解析主机名的东西。
那么我是否遗漏了什么?确实没有使用JmDNS解析主机名的方法吗?

我知道这是可能的,去年我做过,但我现在无法为您提供正确的答案,因为我不在家,也无法告诉您如何做,等我回家后再联系您。 - RaphMclee
@RaphMclee 太棒了!期待着。 - Jake
@Jake,Raph的解决方案对你有用吗?你是否成功使用设置的主机名而不是IP访问了你的Android设备? - George Profenza
你找到解决方案了吗? - Tobia
2个回答

0
如果您需要使用JmDNS从IP地址在局域网中查找远程主机名,可以使用以下代码。如果您需要从主机名映射到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();

-1

使用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()以获取主机的所有地址数组。

如果您想解析服务,则必须调用

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

在serviceAdded方法中。
请查看:快速教程

你尝试过在addServiceListener(String type, ServiceListener listener)方法中使用主机名作为服务类型吗? - RaphMclee
ServiceResolved从未被调用过!!问题可能出在哪里? - nmxprime
只有在开始解析服务时才会调用“serviceResolved”。首先仅调用“serviceAdded”方法。您必须手动解析服务。 - RaphMclee
在serviceAdded中调用jmdns.requestServiceInfo(event.getType(), event.getName());,但我从未得到服务解析,可能是什么问题?(通过wireshark,我确定它发送了解析请求) - nmxprime
@RaphMclee 我了解mDNS和zeroconf,我知道我需要向多播IP发送UDP数据包并等待答复。但我不知道如何使用jmDNS来实现这一点,而且这个答案没有帮助我理解。 - Elazar Leibovich
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接