java - DNS-SD:使用 "mdnsjava"的经验?

标签 java dns-sd mdnsjava

<分区>

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

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

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

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

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

所以,有没有人有过 mdnsjava 的经验? ?

最佳答案

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

关于java - DNS-SD:使用 "mdnsjava"的经验?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28482168/

相关文章:

java - 为什么输出是科学计数法?

bonjour - dns-sd:如何手动注册远程服务

windows - 如何从 Windows 查询 TXT 和 SRV 记录?

cordova - 查找连接到同一网络的设备的 IP 地址和端口

java - 如何在python中获取图像像素的RGBA颜色值

java - GPS 定位精度问题

JAVA - Xuggler - 结合 MP3 音频文件和 MP4 电影