Примеры с JmDNS

Мне удалось получить образцы, которые поставляются с JmDNS, для компиляции и запуска, однако я не могу получить ни один из классов для обнаружения моих служб.

Я работаю в среде Windows с несколькими ПК, на которых работают VNC, SSH и Apache, и я пытался заставить JmDNS обнаружить хотя бы один из них...

В идеале я хочу иметь возможность обнаруживать все работающие серверы VNC в моей сети. Есть ли какое-то соединение клиента и сервера, при котором я могу обнаружить службу, только если я зарегистрировал ее с помощью JmDNS?

Любая помощь в получении некоторых результатов из образцов будет оценена по достоинству, документация не очень помогает.

import java.io.IOException;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.jmdns.JmDNS;
import javax.jmdns.ServiceEvent;
import javax.jmdns.ServiceListener;

/**
 * Sample Code for Service Discovery using JmDNS and a ServiceListener.
 * <p>
 * Run the main method of this class. It listens for HTTP services and lists all changes on System.out.
 *
 * @author Werner Randelshofer
 */
public class DiscoverServices {

    static class SampleListener implements ServiceListener {
        @Override
        public void serviceAdded(ServiceEvent event) {
            System.out.println("Service added   : " + event.getName() + "." + event.getType());
        }

        @Override
        public void serviceRemoved(ServiceEvent event) {
            System.out.println("Service removed : " + event.getName() + "." + event.getType());
        }

        @Override
        public void serviceResolved(ServiceEvent event) {
            System.out.println("Service resolved: " + event.getInfo());
        }
    }

    /**
     * @param args
     *            the command line arguments
     */
    public static void main(String[] args) {
        try {

            // Activate these lines to see log messages of JmDNS
            boolean log = false;
            if (log) {
                Logger logger = Logger.getLogger(JmDNS.class.getName());
                ConsoleHandler handler = new ConsoleHandler();
                logger.addHandler(handler);
                logger.setLevel(Level.FINER);
                handler.setLevel(Level.FINER);
            }

            final JmDNS jmdns = JmDNS.create();
            String type = "_http._tcp.local.";
            if(args.length > 0) {
                type = args[0];
            }
            jmdns.addServiceListener(type, new SampleListener());

            System.out.println("Press q and Enter, to quit");
            int b;
            while ((b = System.in.read()) != -1 && (char) b != 'q') {
                /* Stub */
            }
            jmdns.close();
            System.out.println("Done");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

person Ali    schedule 14.02.2012    source источник
comment
Сам по себе JmDNS вообще не работает, вы действительно должны делать это на всех сетевых картах, используя NetworkTopologyListener. JmmDNS должен сделать это для вас, но не сработал для меня.   -  person Erik Martino    schedule 20.05.2013
comment
@ErikMartino - можете ли вы привести пример NetworkTopologyListener, который действительно работал?   -  person RoundSparrow hilltx    schedule 05.11.2013


Ответы (1)


Чтобы обнаружить конкретный тип службы, вам нужно знать правильное имя типа службы, проверьте DNS SRV ( RFC 2782) Типы услуг:

String bonjourServiceType = "_http._tcp.local.";
bonjourService = JmDNS.create();
bonjourService.addServiceListener(bonjourServiceType, bonjourServiceListener);
ServiceInfo[] serviceInfos = bonjourService.list(bonjourServiceType);
for (ServiceInfo info : serviceInfos) {
  System.out.println("## resolve service " + info.getName()  + " : " + info.getURL());
}
bonjourService.close();

Для VNC используйте _rfb._tcp.local.
Для SSH используйте _ssh._tcp.local.
Для Apache используйте _http._tcp.local.

person yorkw    schedule 15.02.2012
comment
Спасибо, но мой код кажется правильным, я могу подключиться к Mac, который я настроил, но я все еще не могу получить список серверов даже с предоставленным вами кодом (который похож на мой собственный код). Я отредактировал сообщение выше, чтобы добавить свой тестовый код. Можете ли вы попробовать это в своей сети и проверить, работает ли это? Возможно, что-то не так в моих настройках где-то. - person Ali; 15.02.2012
comment
Если это компьютер Mac, вы можете использовать службу VNC (Apple Remote Desktop), используя тип службы = _net-assistant._udp. - person yorkw; 16.02.2012
comment
Мне повезло получить код для обнаружения служб на моем локальном компьютере, но не служб в локальной сети. Когда я запускаю банку jmdns, появляется диалоговое окно, в котором нет проблем с обнаружением машины в моей сети. Итак, в настоящее время планируется просмотреть исходный код этого диалога и, надеюсь, выяснить, что происходит. - person Ali; 16.02.2012