Есть ли работающий пример обнаружения сетевых служб с помощью mdnsjava?
проблема
Я пытаюсь начать работу с обнаружением сетевых служб для моего клиент-серверного приложения Java - в основном, я просто хочу, чтобы клиент обнаружил сервер в том же сегменте Ethernet без конфигурации. Я хотел бы представить на будущее, где есть клиенты на других платформах. Вероятно, просто NETCF и Android. Это не должно быть ракетной хирургией.
Опции
Кажется, что пару часов просмотра перечисленных здесь опций указывают на то, что mdnsjava - лучший вариант в настоящее время. Я опубликовал немного своих исследований ниже, но я ограничен двумя ссылками на мою текущую репутацию.
Я получил примеры Jmdns для компиляции, регистрации и просмотра без особого горя... но он просто не работал надежно. Браузер возвращал IP-адреса в подсети 255.255.254, в тех случаях, когда он вообще обнаруживал службу.
Mdnsjava получает лучшие отзывы, но я не смог заставить его работать. Примеры, которые я нашел, - это фрагменты кода, которые не стоят сами по себе, и javadocs на самом деле не являются документацией - это просто списки открытых методов с безымянными (но обязательными) аргументами.
Avahi4j застрял на версии 0.1 с 2009 года. Не тратить на это никакого времени.
Для Bonjour необходимы системные библиотеки не на платформах Apple.
Upnp, о котором я, по общему признанию, ничего не знаю, похоже, потребует огромного количества инфраструктуры, чтобы удовлетворить мои минимальные требования.
Вопрос
Существует ли скомпилированный, работающий пример регистрации службы с помощью mdnsjava? Я готов, чтобы меня попросили исследовать другую библиотеку, если это мой лучший курс действий в 2015 году.
1 ответ
Оказалось, что самым простым ответом было накатить мой с MulticastSocket, по крайней мере, для моего простого приложения.
Примечание для всех, кто пытается это сделать: попытка заставить клиента работать в.NET CF 3.5 не доставляет особого удовольствия. Асинхронной поддержки нет, таймауты не работают, а документация по поддержке многоадресной рассылки (в CF) отсутствует. Я закончил писать синхронный клиент в своем собственном потоке. Он немедленно возвращает первые пару серверов, а затем ждет других более минуты. Brutal.
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); }
}