我正在尝试在我的 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 和端口访问。
在 Windows 7 上,将带有 .local TLD (= http://roseblade.local/ ) 的名称输入任何地址栏(Firefox、Chrome、Safari、IE)并没有多大作用,而且从我的研究表明,无论如何都是徒劳的。我安装了 Apple Bonjour,但这只能帮助运行 Hobbyist Software 的 Bonjour 浏览器。
就 Linux 而言,我对 elemantaryOS 和 Midori 进行了相同的尝试,但也没有奏效。
我目前无法使用 OSX 或 iOS。
如何在我的浏览器(Firefox、Chrome,无论 Linux、OSX 或 Windows7)中使用 .local 地址的分辨率?难道我做错了什么?在这一点上,我只想验证 mDNS 是否可以在系统上像这样工作。
对有关该问题的 Material 的指针也表示赞赏。
最佳答案
mDNS 和 Bonjour 可能有点令人困惑,因为它们实际上包含一些不同的功能。服务发现,我相信你已经实现了,就是其中之一。解析地址——这就是你要找的——是独立的,需要单独解决。一旦地址解析开始工作,您就可以将服务发现指向解析器提供的 DNS 记录。
mDNS 地址解析的工作原理是通过网络多播 DNS 查询。通过绑定(bind)到 UDP 端口、监听查询并回答它们,您可以向 mDNS 客户端提供 DNS 记录。为此,您可以使用现有的 mDNS 服务器,例如 avahi-daemon,或者,如果您需要自定义功能或与您的应用程序集成,请使用 Node.js 的 multicast-dns 之类的东西来实现。
然而,根据我的经验,这相当古怪。一些网络配置会干扰 mDNS 解析,就像一些操作系统一样(例如 iOS 8,请参阅关于发现与 mDNSResponder 的整个辩论)。