在Android上,通过网络ON和OFF重复调用JmDNS

时间:2014-02-06 12:05:13

标签: android bonjour zeroconf jmdns

我在将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!");
}

1 个答案:

答案 0 :(得分:1)

对于任何可能遇到类似问题的人。 JmDNS库中没有任何问题。在我的代码中,我正在关闭实例调用之间的多播套接字,这就产生了问题。