首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JmDNS:无法解析服务

JmDNS:无法解析服务
EN

Stack Overflow用户
提问于 2013-01-15 22:59:56
回答 2查看 6.2K关注 0票数 7

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

Android应用程序注册一个服务,桌面应用程序为该服务添加一个侦听器。我已经在四台设备中的三台上运行得很好,但是第四台(三星Galaxy Tab10.1 PT7500,运行安卓3.2)我无法解决这项服务。我的处理程序接收serviceAdded事件,但没有接收serviceResolved事件。我还尝试过调用jmdns.requestServiceInfojmdns.getServiceInfo,但前者什么也不做,后者超时并返回null。

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

有谁知道是什么导致了这个问题吗?

启动服务的代码:

代码语言:javascript
复制
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);

客户端/监听器的代码:

代码语言:javascript
复制
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
    }
});

输出:

代码语言:javascript
复制
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
] 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-18 23:49:52

github repository上查看最新的源代码版本做到了这一点。发现服务现在在所有设备上都能很好地工作。(注意:我使用的是之前从sourceforge下载的JmDNS版本3.4.1 )

浏览了SVN的历史,自3.4.1版本以来,似乎有几个提交与解决服务的问题有关。

编辑:将svn替换为github存储库,因为jmdns已移至该存储库。

票数 8
EN

Stack Overflow用户

发布于 2013-01-18 23:27:17

使用JmDNS.create(InetAddress addr, String name)而不是JmDNS.create()。在较新的安卓版本中,JmDNS需要更多地了解本地设备和它正在监听的网络接口。

代码语言:javascript
复制
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
    }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14340458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档