Java 如何使用JmDNS解析Bonjour域名

Java 如何使用JmDNS解析Bonjour域名,java,android,bonjour,hostname,jmdns,Java,Android,Bonjour,Hostname,Jmdns,作为我正在开发的应用程序的一部分,我需要能够解析与“你好”对应的正确IP 例如,我得到了jack.local,需要将其解析为192.168.1.141,这是与jack关联的IP地址 我已经浏览了JmDNS API,我能找到的最多的方法是,如果类型和名称已知,则可以解析服务。但是,我无法找到任何允许解析主机名的方法 我是不是错过了什么?真的没有办法使用JmDNS解析主机名吗?使用JmDNS,您可以收听服务。要订阅,请使用这些函数 jmdns = JmDNS.create(); jmdns.addS

作为我正在开发的应用程序的一部分,我需要能够解析与“你好”对应的正确IP

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

我已经浏览了JmDNS API,我能找到的最多的方法是,如果类型和名称已知,则可以解析服务。但是,我无法找到任何允许解析主机名的方法


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

使用JmDNS,您可以收听服务。要订阅,请使用这些函数

jmdns = JmDNS.create();
jmdns.addServiceListener(String type, ServiceListener listener);
一旦jmdns找到服务,
ServiceListener
就会收到通知。侦听器有三个公共功能:

serviceResolved(ServiceEvent event)
serviceRemoved(ServiceEvent event)
serviceAdded(ServiceEvent event)
每个人都有
服务事件
。现在调用
event.getInfo().getHostAddresses()
以获取主机所有地址的数组

如果你想解决服务问题,你必须打电话

jmdns.requestServiceInfo(event.getType(), event.getName(), 1);
在serviceAdded方法中


查看:

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


我知道这是可能的,我去年就做了,但我不能为你找到正确的答案,我不在家,也不能告诉你怎么做,我回家后会告诉我的。@RaphMclee真棒!向前看。@Jake Raph的解决方案对你有用吗?您是否使用设置的主机名而不是IP访问android设备?您找到解决方案了吗?这假设您知道服务的类型。再一次,正如我在问题中指出的,我正在寻找一种方法来查找给定主机的IP。所以它需要按主机名搜索…您是否尝试在addServiceListener方法中使用主机名作为服务类型(字符串类型,ServiceListener listener)<代码>服务解析从未调用过!!问题出在哪里?只有在您开始解析服务时才会调用“serviceResolved”。首先,仅调用“serviceAdded”方法。您必须手动解析服务在serviceAdded中,我从未解决该服务,可能是什么问题?(通过wireshark,我确信它会发送解决请求)
    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();