4

我现在正在将 DNS-DS 库“ mdnsjava ”实现到我的 Android 项目中,因为它在多个位置都提到过,例如在 SO:

除了 JMDNS,还有其他用于 bonjour/zeroconf 的 Java 库吗?.

在实现时,我想知道这个实现是否真的使用了任何缓存和/或它的性能有多稳定。

现在我在过去 2 年里一直在使用 jmDNS,但是这个库在暂停发现(后台应用程序)时无法保留缓存。

此外,jmDNS 在发现设备时速度慢且不稳定。

那么,有人对mdnsjava有任何经验吗?

4

2 回答 2

4

同时我可以说,mdnsjava 在大多数情况下工作得非常好且稳定。与 jMDNS 相比,更好更快。

这是一些重新启动完整发现并启动/停止发现的代码,也许它可以帮助某人:

MulticastDNSService mDNSService = null;
Browse browse = null;
Object serviceDiscoveryInstance = null;

public void stop() {
    try {
        if (serviceDiscoveryInstance != null && mDNSService != null) {
            mDNSService.stopServiceDiscovery(serviceDiscoveryInstance);
            mDNSService.close();
        }

        serviceDiscoveryInstance = null;
        //mDNSService = null;
        if (browse != null) {
            browse.close();
            // this is required, otherwise the listeners won't get called in next run
            browse = null;
        }

        Querier querier = MulticastDNSLookupBase.getDefaultQuerier();
        if (querier != null) {
            querier.close();
        }
        MulticastDNSLookupBase.setDefaultQuerier(null);
    } catch (Exception e) {
        Log(..)
    }
}

public void start() {
    try {
        Querier querier = MulticastDNSLookupBase.getDefaultQuerier();
        if (querier != null) {
            if (mDNSService == null) {
                mDNSService = new MulticastDNSService();
            }

            if (browse == null) {
                browse = new Browse(SERVICE_TYPE);
            }

            if (serviceDiscoveryInstance == null) {
                serviceDiscoveryInstance = mDNSService.startServiceDiscovery(browse, this);
            }

            // add existing entries
            Lookup resolve = new Lookup(SERVICE_TYPE);
            resolve.setQuerier(mDNSService.getQuerier());
            ServiceInstance[] services = resolve.lookupServices();
            for (ServiceInstance service : services) {
                addDevice(service);
            }
            resolve.close();
        } else {
            Log.e("Cannot start mDNS-discovery because querier is not set up!");
            resetDiscovery();
        }
    } catch (Exception e) {
        Log.e("Error while discovering network.", e);
        resetDiscovery();
    }
}

public void clearCaches() {
    if (MulticastDNSCache.DEFAULT_MDNS_CACHE != null) {
        MulticastDNSCache.DEFAULT_MDNS_CACHE.clearCache();
    }
    mDNSService = null;
    browse = null;
}

private void resetDiscovery(){
    stop();
    mDNSService = null;
    browse = null;
}

您可以使用上述方法启动/停止发现,并通过重置整个发现

stop();
clearCaches();
start();
于 2015-03-12T12:20:10.830 回答
1

我从 JmDNS 切换到 mdnsjava 是因为 JmDNS 似乎无法正常工作。有时它不会检测到任何东西。

我在 mdnsjava 方面有很好的经验,并且通过添加 pom.xml 并指出了一些简单的错误修复,对此做出了一些贡献。mdnsjava 唯一的问题是,由于某种原因,它似乎无法从头开始完全重新启动(完全重置正在运行的程序的所有状态),但只要它启动它对我来说就完美无缺。我没有注意到我的 Android 后台服务使用它有任何其他问题。我向作者指出了重置问题,他说他遇到过同样的问题,如果有时间,他可能会看一下。

于 2015-03-12T10:31:12.090 回答