2013-01-17 73 views
8

作爲我正在開發的應用程序的一部分,我需要能夠解析與Bonjour hostname相對應的正確IP。如何使用JmDNS解析Bonjour域名

例如,我得到jack.local並需要將其解析爲192.168.1.141這是與插孔關聯的IP地址。

我一直在梳理JmDNS API,並且我可以找到的大多數方法都是允許在已知類型和名稱的情況下解析服務的方法。但是,我根本找不到任何可以解析主機名的東西。

所以我錯過了什麼?是否真的沒有辦法使用JmDNS解析主機名?

+0

我知道它的可能性,去年我做過了,但是我不能爲你得到正確的答案,我不在家,也不能告訴你如何去做,當我回到家時,我會回來。 – RaphMclee

+0

@RaphMclee太棒了!期待。 – Jake

+0

@Jake Raph的解決方案適合你嗎?你有沒有設法訪問你的Android設備使用設置主機名而不是IP? –

回答

-1

隨着jmdns你聽服務。爲了一旦jmdns發現ServiceListener得到通知的服務訂閱使用功能

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

。聽衆有三種公共功能:

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

與大家你得到的ServiceEvent。現在請致電event.getInfo().getHostAddresses()獲取主機所有地址的數組。

如果要解決服務,你必須調用

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

在serviceAdded方法。

看一看:Quick Tutorial

+0

這假定您知道服務的類型。再次,正如我在問題中所指出的,我正在尋找一種方法來找到主機的IP。因此,它需要通過主機名搜索... – Jake

+0

您是否嘗試在方法addServiceListener(String type,ServiceListener listener)中將Servicename作爲Service類型使用; – RaphMclee

+0

'ServiceResolved'不會被稱爲!問題在哪裏? – nmxprime

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();