首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有使用mdnsjava的工作网络服务发现示例吗?

有使用mdnsjava的工作网络服务发现示例吗?
EN

Stack Overflow用户
提问于 2015-10-28 20:12:41
回答 1查看 1.8K关注 0票数 2

问题

我正试图从我的Java客户机/服务器应用程序的网络服务发现开始--基本上,我只希望客户机在没有配置的情况下在同一个以太网段上找到服务器。我想为将来在其他平台上有客户的地方做准备。可能只有NETCF和Android。这不应该是火箭手术。

选项

浏览这里列出的选项几个小时似乎表明mdnsjava是目前最好的选择。我已经在下面发布了一些我的研究,但我被限制在两个链接在我目前的声誉。

我有金恩示例编译、注册和浏览,没有太多的悲伤.但它根本不可靠。浏览器在255.255.254子网上返回IP地址,在这些情况下它找到了该服务。

马德斯瓦得到了更好的评价,但我完全没能让它运行。我发现的例子是那些不独立的代码片段,而javadocs并不是真正的文档--它们只是带有未命名(但是强制的)参数的公共方法的列表。

自2009年以来,Avahi4j一直停留在0.1级。没有花时间在这上面。

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

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

问题

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-30 16:40:40

最简单的解决方法是使用MulticastSocket,至少对我的简单应用程序是这样的。

请注意,任何试图这样做的人:尝试让客户机在.NET CF3.5中工作并不是什么有趣的事情。不存在异步支持,超时不起作用,关于组播支持(在CF中)的文档也不存在。最后,我在自己的线程中编写了一个同步客户机。它立即返回前两个服务器,然后等待其他服务器超过一分钟。太残暴了。

代码语言:javascript
复制
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);         }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33400738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档