DNS-SD:使用 "mdnsjava" 的经验?
DNS-SD: Experience with "mdnsjava"?
我现在正在将 DNS-DS 库“mdnsjava”实施到我的 Android-项目中,因为它在多个位置都提到过,例如这里的 SO:
Are there any other Java libraries for bonjour/zeroconf apart from JMDNS?.
在实现时,我想知道这个实现是否真的使用了任何缓存and/or它的性能有多稳定。
最近 2 年我一直在使用 jmDNS,但是这个库无法在暂停发现(应用程序在后台)时保留缓存。
此外,jmDNS 在发现设备时速度缓慢且不稳定。
那么,有没有人使用过 mdnsjava?
我从 JmDNS 切换到 mdnsjava,因为 JmDNS 似乎无法正常工作。有时它不会检测到任何东西。
我对 mdnsjava 有很好的经验,并且通过添加 pom.xml 并指出了一些简单的错误修复,为此做出了一些贡献。关于 mdnsjava 的唯一问题是,由于某种原因,它似乎无法从头开始完全重启自身(完全重置 运行 程序的所有状态),但只要它启动,它对我来说就完美无缺.我没有注意到使用它的 Android 后台服务有任何其他问题。我向作者指出了重置问题,他说他也遇到过同样的问题,如果他有时间的话,他可能会看看。
同时我可以说,mdnsjava 在大多数情况下工作得非常非常好和稳定。与 jMDNS 相比更好更快。
这里有一些代码可以重新启动完整的发现和 start/stop 发现,也许对某人有帮助:
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;
}
您可以start/stop使用上述方法发现,并通过
重置整个发现
stop();
clearCaches();
start();
我现在正在将 DNS-DS 库“mdnsjava”实施到我的 Android-项目中,因为它在多个位置都提到过,例如这里的 SO:
Are there any other Java libraries for bonjour/zeroconf apart from JMDNS?.
在实现时,我想知道这个实现是否真的使用了任何缓存and/or它的性能有多稳定。
最近 2 年我一直在使用 jmDNS,但是这个库无法在暂停发现(应用程序在后台)时保留缓存。
此外,jmDNS 在发现设备时速度缓慢且不稳定。
那么,有没有人使用过 mdnsjava?
我从 JmDNS 切换到 mdnsjava,因为 JmDNS 似乎无法正常工作。有时它不会检测到任何东西。
我对 mdnsjava 有很好的经验,并且通过添加 pom.xml 并指出了一些简单的错误修复,为此做出了一些贡献。关于 mdnsjava 的唯一问题是,由于某种原因,它似乎无法从头开始完全重启自身(完全重置 运行 程序的所有状态),但只要它启动,它对我来说就完美无缺.我没有注意到使用它的 Android 后台服务有任何其他问题。我向作者指出了重置问题,他说他也遇到过同样的问题,如果他有时间的话,他可能会看看。
同时我可以说,mdnsjava 在大多数情况下工作得非常非常好和稳定。与 jMDNS 相比更好更快。
这里有一些代码可以重新启动完整的发现和 start/stop 发现,也许对某人有帮助:
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;
}
您可以start/stop使用上述方法发现,并通过
重置整个发现stop();
clearCaches();
start();