DNS-SD: опыт работы с "mdnsjava"?

Я сейчас внедряю библиотеку DNS-DS " mdnsjava " в мой Android-проект, как это упоминается в нескольких позициях, например, здесь, в SO:

Существуют ли другие библиотеки Java для bonjour/zeroconf помимо JMDNS?,

Во время реализации мне интересно, действительно ли эта реализация использует какой-либо кеш и / или насколько стабильно она может работать.

Прямо сейчас я использую jmDNS в течение последних 2 лет, но эта библиотека не смогла сохранить кеш при приостановке обнаружения (приложение в фоновом режиме).

Кроме того, jmDNS медленно и нестабильно обнаруживал устройства.

Итак, есть ли у кого-нибудь опыт работы с mdnsjava?

2 ответа

Решение

Между тем могу сказать, что 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();

Я переключился с JmDNS на mdnsjava, потому что JmDNS просто не работал должным образом. Иногда это ничего не обнаружит.

У меня очень хороший опыт работы с mdnsjava, и я внес небольшой вклад в это, добавив pom.xml и указал на несколько простых исправлений ошибок. Единственное, что есть в mdnsjava, - это то, что он по какой-то причине не может полностью перезапустить себя (сбросить точно все состояние запущенной программы), но пока он работает, он работает для меня безупречно. Других проблем с фоновыми службами Android, которые я использую, я не заметил. Я указал автору на проблему сброса, и он сказал, что столкнулся с той же проблемой, и что, если у него будет время, он может взглянуть на нее однажды.

Другие вопросы по тегам