JmDNS:无法解析服务

时间:2013-01-15 14:59:56

标签: java android jmdns

我正在尝试实施JmDNS发现,以便在Android应用和桌面应用之间进行通信。我遵循了以下教程: http://home.heeere.com/tech-androidjmdns.html

Android应用注册服务,桌面应用程序为服务添加了一个监听器。我用四分之三的设备完全正常工作,但是第四部分(运行Android 3.2的三星Galaxy Tab 10.1 PT7500)我无法解析该服务。 我的处理程序收到serviceAdded个事件,但没有serviceResolved个事件。 我也尝试过调用jmdns.requestServiceInfojmdns.getServiceInfo,但前者没有做任何事情,后者超时并返回null。

然而,jmdns-browser能够很好地解析服务,所以它不是设备。 两个设备上都没有防火墙。该服务始终使用IPv4地址。

有人知道可能导致这个问题的原因吗?

启动服务的代码:

jmdns = JmDNS.create(wifiAddress);

ServiceInfo serviceInfo = ServiceInfo.create(Constants.SERVICE_TYPE, 
    Constants.SERVICE_NAME, Constants.ZEROCONF_PORT, "my service");

HashMap<String, String> deviceInfoMap = new HashMap<String, String>();
deviceInfoMap.put(Constants.KEY_DEVICE_NAME, getDeviceName());
deviceInfoMap.put(Constants.KEY_DEVICE_ID, getDeviceId());
// ...
serviceInfo.setText(deviceInfoMap);

jmdns.registerService(serviceInfo);

客户/听众的代码:

jmdns = JmDNS.create();
jmdns.addServiceListener(Constants.SERVICE_TYPE, serviceListener = new ServiceListener() {
    @Override
    public void serviceResolved(ServiceEvent event) {
        System.out.println("Service resolved: " + event.getName() + 
            " of type " +    event.getType());
    }

    @Override
    public void serviceRemoved(ServiceEvent event) {
        System.out.println("Service removed: " + event.getName() + 
            " of type " + event.getType());
    }

    @Override
    public void serviceAdded(ServiceEvent event) {
        System.out.println("Service added: " + event.getName() + 
            " of type " + event.getType());
        ServiceInfo info = jmdns.getServiceInfo(event.getType(), event.getName());
        System.out.println("Service info: " + info); // --> null
    }
});

输出:

Service added: my service @ GT-P7500 of type _mytype._tcp.local.
Service info: null
Service added: my service @ Galaxy Nexus of type _mytype._tcp.local.
Service info: [ServiceInfoImpl@183779345 
    name: 'my service @ Galaxy Nexus ._mytype._tcp.local.' 
    address: '/192.168.1.154:4242 ' status: 'DNS: myhost.local. 
    state: probing 1 task: null', has data
    deviceName: Galaxy Nexus
    deviceId: <id>
    displayDensity: XHDPI
] 

2 个答案:

答案 0 :(得分:8)

github repository查看最新的源代码版本就可以了。发现该服务现在可以在所有设备上正常运行。 (注意:我使用的是我之前从sourceforge下载过的JmDNS版本3.4.1)

浏览了SVN历史记录后,自3.4.1版本发布以来,似乎有一些与解析服务问题相关的提交。

编辑:自从jmdns移动到那里后,用github存储库替换了svn。

答案 1 :(得分:1)

使用JmDNS.create(InetAddress addr, String name)代替JmDNS.create()。在更新版本的Android中,JmDNS需要了解有关本地设备及其正在侦听的网络接口的更多信息。

JmDNS jmdns; // somewhere global

// In a background thread 
public void buildJmDNS() {
    InetAddress addr = InetAddress.getLocalHost();
    String hostname = InetAddress.getByName(addr.getHostName()).toString();
    try {
        jmdns = JmDNS.create(addr, hostname); // throws IOException
    } catch (IOException e) {
       e.printStackTrace(); // handle this if you want
    }
}

我遇到了您遇到的同样问题,这为我解决了这个问题。我试图找到我发现的例子,说明为什么这是必要的,但我不能。