【问题标题】:Is there a working network service discovery example with mdnsjava?是否有使用 mdnsjava 的有效网络服务发现示例?
【发布时间】:2015-10-28 20:12:41
【问题描述】:

问题

我正在尝试开始为我的 Java 客户端/服务器应用程序进行网络服务发现——基本上,我只是希望客户端无需配置即可在同一以太网段上找到服务器。我想为将来有客户在其他平台上提供服务。可能只是 NETCF 和 Android。这不应该是火箭手术。

选项

浏览the options listed here 几个小时似乎表明 mdnsjava 是目前最好的选择。我在下面发布了一些我的研究,但我目前的声誉仅限于两个链接。

我得到了Jmdns 示例来编译、注册和浏览而没有太多的悲伤……但它根本无法可靠地工作。浏览器返回 255.255.254 子网的 IP 地址,在那些情况下它根本找不到服务。

Mdnsjava 得到了更好的评价,但我完全没能让它运行起来。我发现的示例是不独立的代码 sn-ps,javadocs 并不是真正的文档——它们只是带有未命名(但强制)参数的公共方法列表。

Avahi4j 自 2009 年以来一直停留在 v0.1。没有花任何时间。

Bonjour 显然需要非 Apple 平台上的系统库。

Upnp,我承认对它一无所知,看起来它需要大量的基础设施才能满足我的最低要求。

问题

是否存在使用 mdnsjava 注册服务的可编译的工作示例?如果这是我在 2015 年的最佳行动方案,我准备被告知调查另一个图书馆。

【问题讨论】:

    标签: java mdns jmdns mdnsjava


    【解决方案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);         }
    }
    

    【讨论】:

    • 我得出了同样的结论。尝试了一堆 mDNS 库。使用 JmDNS 实现了一个解决方案,但由于内存和线程耗尽问题而不得不将其拉出。最终打包到一个简单的 UDP 广播解决方案。它很简单,以至于我可以完全理解它,老实说,我不确定我失去了什么功能。
    猜你喜欢
    • 2015-09-22
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    相关资源
    最近更新 更多