Есть ли рабочий пример обнаружения сетевых сервисов с mdnsjava?

Проблема

Я пытаюсь начать с обнаружения сетевых служб для моего приложения клиент / сервер Java - в основном, я просто хочу, чтобы клиент нашел сервер в том же сегменте Ethernet без конфигурации. Хочу предусмотреть на будущее, когда есть клиенты на других платформах. Наверное, просто NETCF и Android. Это не должно быть ракетной операцией.

Опции

Несколько часов просмотра параметров перечисленные здесь, похоже, указывают на то, что mdnsjava - лучший вариант в настоящее время. Я разместил немного своих исследований ниже, но при моей текущей репутации я ограничен двумя ссылками.

У меня есть примеры Jmdns для компиляции, регистрации и просмотра без много горя ... но он просто не работал надежно. Браузер возвращал IP-адреса в подсети 255.255.254 в тех случаях, когда он вообще находил службу.

Mdnsjava получает лучшие отзывы, но мне совершенно не удалось запустить его. Примеры, которые я нашел, представляют собой фрагменты кода, которые не существуют сами по себе, а документы javadoc на самом деле не являются документацией - это просто списки общедоступных методов с безымянными (но обязательными) аргументами.

Avahi4j застрял на v0.1 с 2009 года. Не тратил на это время.

Bonjour, по-видимому, требует системных библиотек на платформах, отличных от Apple.

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

Вопрос

Существует ли компилируемый рабочий пример регистрации службы с помощью mdnsjava? Я готов к тому, что мне предложат исследовать другую библиотеку, если это будет моим лучшим курсом действий в 2015 году.


person Autumn    schedule 28.10.2015    source источник


Ответы (1)


Оказывается, самым простым ответом было накатить свой собственный с MulticastSocket, по крайней мере, для моего простого приложения.

Замечание для всех, кто пытается это сделать: пытаться заставить клиента работать в .NET CF 3.5 было не очень интересно. Асинхронной поддержки нет, таймауты не работают, а документация по поддержке многоадресной рассылки (в CF) отсутствует. В итоге я написал синхронный клиент в отдельном потоке. Он немедленно возвращает первую пару серверов, а затем ожидает других более минуты. Жестокий.

import java.net.MulticastSocket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Main {
    public static void main(String[] args) {
        if( args.length == 0 ) runClient();
        if(args[0].equals("s")) runServer();
        else runClient();
    }

    static String mcastAddr = "239.255.100.100";  // Chosen at random from local network block at http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml
    static int port = 4446;

    public static void runServer() {
        while (true) {
            try {
                MulticastSocket s = new MulticastSocket(port);
                InetAddress group = InetAddress.getByName(mcastAddr);
                s.joinGroup(group);

                byte[] recData = new byte[100];
                DatagramPacket receivePacket = new DatagramPacket(recData, recData.length);
                s.receive(receivePacket);
                String strrec = new String(recData,0,receivePacket.getLength());
                print("server received: " + strrec);
                print("from: " + receivePacket.getAddress().toString());

                if(strrec.equals("Are you there?")) {
                    String msg = "Here I am";
                    byte[] msgData = msg.getBytes();
                    DatagramPacket msgPacket = new DatagramPacket(msgData, msgData.length, receivePacket.getAddress(), receivePacket.getPort());
                    s.send(msgPacket);
                    print("server sent: " + msg + "\n");
                } else {
                    print("Didn't send; unrecognized message.");
                }


            } catch (Exception e) {
                print(e.toString());
            }
        }
    }

    public static void runClient() {
        try {
            DatagramSocket s = new DatagramSocket();

            String msg = "Are you there?";  // Magic string
            byte[] msgData = msg.getBytes();
            DatagramPacket datagramPacket = new DatagramPacket(msgData, msgData.length, InetAddress.getByName(mcastAddr), port);
            s.send(datagramPacket);
            print("client sent: " + msg);

            byte[] recData = new byte[100];
            DatagramPacket receivePacket = new DatagramPacket(recData, recData.length);
            s.receive(receivePacket);
            String strrec = new String(recData,0,receivePacket.getLength());
            print("client received: " + strrec);
            print("from " + receivePacket.getAddress().toString() + " : " + receivePacket.getPort());

            System.exit(0);
        } catch (Exception e) {
            print(e.toString());
        }
    }
    static void print(String s) {             System.out.println(s);         }
}
person Autumn    schedule 30.10.2015
comment
Я пришел к такому же выводу. Пробовал кучу библиотек mDNS. Реализовал решение с использованием JmDNS, и ему пришлось вытащить его из-за проблем с нехваткой памяти и потоков. В конце концов, мы разработали простое решение для широковещательной передачи UDP. Это достаточно просто, чтобы я мог полностью это понять, и, честно говоря, я не уверен, какую функциональность я потерял. - person Jeffrey Blattman; 14.11.2015