【问题标题】:DNS-SD: Experience with "mdnsjava"? [closed]DNS-SD:使用“mdnsjava”的经验? [关闭]
【发布时间】:2015-02-12 16:06:18
【问题描述】:

我现在正在将 DNS-DS 库“mdnsjava”实施到我的 Android 项目中,正如在多个位置提到的那样,例如在 SO:

Are there any other Java libraries for bonjour/zeroconf apart from JMDNS?.

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

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

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

那么,有没有人使用mdnsjava 的经验?

【问题讨论】:

    标签: java dns-sd mdnsjava


    【解决方案1】:

    同时我可以说,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();
    

    【讨论】:

    • DEFAULT_MDNS_CACHE 似乎是 MulticastDNSCache 类中受保护的静态字段,我无法像上面显示的那样访问它。
    • 是的,如果您使用源代码,则需要将其更改为公开,或者只需更改可访问性并通过反射访问它
    • 谢谢您,Martin L。我将重新启动项目,修复报告的错误并应用建议的修复,例如您提供的代码。
    • 应该有一个 getCache() 方法可供您直接访问缓存,而不是访问默认缓存。默认缓存并不总是使用,可以在运行时换出新缓存。
    • 碰巧,有没有人有关于如何使用这个库的完整示例?我没有运气让它工作!另外,如果可以,请参阅我的问题stackoverflow.com/questions/37353835/…
    【解决方案2】:

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

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

    【讨论】:

    • 嗨,J.,感谢您的回答。我的意思是,我还在我的项目中实现了 mdnsjava,并且它在大多数情况下都能完美运行。我开发了一种方法来重置整个发现,并以“正确”的方式启动/停止发现。我会尝试在这里放置一些代码..
    • 太棒了!太棒了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 2012-03-05
    • 1970-01-01
    • 2010-11-04
    • 2011-03-31
    • 2011-07-15
    相关资源
    最近更新 更多