4

我正在尝试在我的 LAN 中运行 HTTP 服务器,并希望通过使用另一台台式计算机上的浏览器来访问它。由于我不喜欢手动输入 IP 地址和端口,我尝试使用 jmDNS 设置 mDNS。

        String type = "_http._tcp.local.";
        jmdns = JmDNS.create();
        jmdns.addServiceListener(type, listener = new ServiceListener() {
            @Override
            public void serviceResolved(ServiceEvent ev) {
                Log.d(LogTag.SERVER, "Service resolved: " + ev.getInfo().getQualifiedName() + " port:"
                        + ev.getInfo().getPort());
            }

            @Override
            public void serviceRemoved(ServiceEvent ev) {
                Log.d(LogTag.SERVER, "Service removed: " + ev.getName());
            }

            @Override
            public void serviceAdded(ServiceEvent event) {
                // Required to force serviceResolved to be called again (after the first search)
                jmdns.requestServiceInfo(event.getType(), event.getName(), 1);
            }
        });
        serviceInfo = ServiceInfo.create(type, NAME, PORT, "test service");
        jmdns.registerService(serviceInfo);

mDNS 条目显示在 ZeroConf 浏览器应用程序上就好了。可以通过 IP 和端口访问服务器。

ZeroConf 浏览器截图

在 Windows 7 上,在任何地址栏(Firefox、Chrome、Safari、IE)中输入带有 .local TLD (= http://roseblade.local/ ) 的名称并没有多大作用,而且我的研究表明几乎是徒劳的反正任务。我安装了 Apple Bonjour,但这只有助于运行 Hobbyist Software 的 Bonjour 浏览器。就 Linux 而言,我对 elemantaryOS 和 Midori 进行了同样的尝试,但这也没有用。我目前无法使用 OSX 或 iOS。

如何获得 .local 地址的解析以在我的浏览器(Firefox、Chrome、Linux、OSX 或 Windows7 上的任何设备)中工作?难道我做错了什么?在这一点上,我只想验证 mDNS 是否可以在系统上像这样工作。

也赞赏有关该问题的材料的指针。

4

1 回答 1

2

mDNS 和 Bonjour 可能有点令人困惑,因为它们实际上包含一些不同的功能。我相信您已经实现的服务发现就是其中之一。解析地址——这就是你要找的——是分开的,需要单独解决。一旦您的地址解析工作,您可以将您的服务发现指向您的解析器提供的 DNS 记录。

mDNS 地址解析通过在网络上多播 DNS 查询来工作。通过绑定到 UDP 端口、侦听查询并回答它们,您可以向 mDNS 客户端提供 DNS 记录。为此,您可以使用现有的 mDNS 服务器,例如 avahi-daemon,或者,如果您需要自定义功能或与您的应用程序集成,请使用 Node.js 的multicast-dns之类的东西来实现一个。

然而,根据我的经验,这是相当不稳定的。某些网络配置会干扰 mDNS 解析,某些操作系统也是如此(例如 iOS 8,请参阅围绕发现与 mDNSResponder 的整个辩论)。

于 2015-09-14T16:56:22.910 回答