mdnsjava 是否有一个有效的网络服务发现示例?
Is there a working network service discovery example with mdnsjava?
问题
我正在尝试为我的 Java client/server 应用程序开始网络服务发现 -- 基本上,我只希望客户端无需配置即可在同一以太网段上找到服务器。我想为将来在其他平台上有客户的地方提供服务。可能只是 NETCF 和 Android。这不应该是火箭手术。
选项
几个小时的浏览 the options listed here 似乎表明 mdnsjava 是目前最好的选择。我在下面发布了一些我的研究,但我目前的声誉仅限于两个链接。
我得到了 Jmdns 示例来编译、注册和浏览而没有太多的悲伤......但它根本无法可靠地工作。浏览器返回 255.255.254 子网上的 IP 地址,在这些情况下它根本找不到该服务。
Mdnsjava 得到更好的评价,但我完全没能做到 运行。我发现的示例是不独立存在的代码片段,并且 javadoc 并不是真正的文档——它们只是 public 方法的列表,这些方法具有未命名(但强制性)的参数。
Avahi4j 自 2009 年以来一直停留在 v0.1。没有花任何时间在上面。
Bonjour 显然需要非 Apple 平台上的系统库。
Upnp,我承认我对此一无所知,看起来它需要大量的基础设施来满足我的最低要求。
问题
是否存在使用 mdnsjava 注册服务的可编译的工作示例?如果那是我 2015 年的最佳行动方案,我准备好被告知调查另一个图书馆。
事实证明,最简单的答案是使用 MulticastSocket 自己动手,至少对于我的简单应用程序来说是这样。
任何尝试这样做的人请注意:尝试让客户端在 .NET CF 3.5 中工作并不是很有趣。没有异步支持,超时不起作用,并且不存在关于多播支持(在 CF 中)的文档。我最终在自己的线程中编写了一个同步客户端。它 returns 立即处理前几台服务器,然后等待其他服务器超过一分钟。残酷。
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); }
}
问题
我正在尝试为我的 Java client/server 应用程序开始网络服务发现 -- 基本上,我只希望客户端无需配置即可在同一以太网段上找到服务器。我想为将来在其他平台上有客户的地方提供服务。可能只是 NETCF 和 Android。这不应该是火箭手术。
选项
几个小时的浏览 the options listed here 似乎表明 mdnsjava 是目前最好的选择。我在下面发布了一些我的研究,但我目前的声誉仅限于两个链接。
我得到了 Jmdns 示例来编译、注册和浏览而没有太多的悲伤......但它根本无法可靠地工作。浏览器返回 255.255.254 子网上的 IP 地址,在这些情况下它根本找不到该服务。
Mdnsjava 得到更好的评价,但我完全没能做到 运行。我发现的示例是不独立存在的代码片段,并且 javadoc 并不是真正的文档——它们只是 public 方法的列表,这些方法具有未命名(但强制性)的参数。
Avahi4j 自 2009 年以来一直停留在 v0.1。没有花任何时间在上面。
Bonjour 显然需要非 Apple 平台上的系统库。
Upnp,我承认我对此一无所知,看起来它需要大量的基础设施来满足我的最低要求。
问题
是否存在使用 mdnsjava 注册服务的可编译的工作示例?如果那是我 2015 年的最佳行动方案,我准备好被告知调查另一个图书馆。
事实证明,最简单的答案是使用 MulticastSocket 自己动手,至少对于我的简单应用程序来说是这样。
任何尝试这样做的人请注意:尝试让客户端在 .NET CF 3.5 中工作并不是很有趣。没有异步支持,超时不起作用,并且不存在关于多播支持(在 CF 中)的文档。我最终在自己的线程中编写了一个同步客户端。它 returns 立即处理前几台服务器,然后等待其他服务器超过一分钟。残酷。
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); }
}