我在将JmDNS库用于Android应用时遇到问题。
由于Bonjour不发送定期保持活动消息,因此我每隔30秒关闭并打开一个新的JmDNS实例,这样我就可以调用serviceAdded和serviceResolved函数。
但是在这些实例创建之间,如果我关闭并打开Wifi,虽然JmDNS实例的创建成功,但我的serviceAdded和serviceResolved函数不会被调用。
我的主要疑虑是:
1)可以一次又一次地重新创建这些实例,从而实现一种轮询吗?或者有更好的方法吗?
2)如果关闭并打开网络,每次创建JmDNS实例时都需要做些什么吗?
以下是我的代码片段:
private void _startJmDnsService() throws IOException {
if (mJmdns != null) {
if (mJmDnsServiceListener != null) {
mJmdns.removeServiceListener(mBonjourServiceType, mJmDnsServiceListener);
mJmDnsServiceListener = null;
}
mJmdns.close();
mJmdns = null;
}
Log.d(TAG, "starting JmDNS");
mJmdns = JmDNS.create(getInet4Address());
mJmDnsServiceListener = new ServiceListener() {
public void serviceResolved(ServiceEvent ev) {
ServiceInfo serviceInfo = ev.getInfo();
Log.w(TAG, "serviceResolved for device " + serviceInfo.getName());
}
public void serviceRemoved(ServiceEvent ev) {
ServiceInfo serviceInfo = ev.getInfo();
Log.w(TAG, "serviceRemoved for device " + serviceInfo.getName());
CDevice.removeDevice(deviceId);
}
public void serviceAdded(ServiceEvent event) {
// Required to force serviceResolved to be called again
// (after the first search)
ServiceInfo serviceInfo = event.getInfo();
Log.w(TAG, "serviceAdded for device " + serviceInfo.getName());
mJmdns.requestServiceInfo(event.getType(), event.getName(), 1);
}
};
mJmdns.addServiceListener(mBonjourServiceType, mJmDnsServiceListener);
Log.w(TAG, "mJmdns Service Listener added!");
}
答案 0 :(得分:1)
对于任何可能遇到类似问题的人。 JmDNS库中没有任何问题。在我的代码中,我正在关闭实例调用之间的多播套接字,这就产生了问题。