- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在尝试让 JmDNS 在 Mac OS X 上工作时遇到了问题。症状是我可以发现网络上的任何服务,除了我自己计算机上的服务之外。它们是在本地主机上还是在我的计算机上运行的虚拟机上并不重要 - 无论哪种情况,它们都不会从 list
调用中返回。
我设法将我们正在做的事情浓缩为一个测试,该测试在 Windows 上通过,但在 Mac OS X 上失败。现在的问题是我无法弄清楚问题出在哪里。
@Test
public void testAdvertisingOverLoopback() throws Exception
{
// happens on any address but loopback is the strangest
InetAddress address = InetAddress.getLoopbackAddress();
String type = "_test._tcp.local.";
String name = "test-service";
int port = 9999;
Map<String, String> properties = ImmutableMap.of("key", "value");
// simulate the service starting up. issue also occurs in separate VMs
try (JmDNS serviceDns = JmDNS.create(address))
{
serviceDns.registerService(ServiceInfo.create(type, name, port,
0, 0, properties));
try (JmDNS clientDns = JmDNS.create(address))
{
ServiceInfo[] services = clientDns.list(type);
// One of the entries should:
assertThat(services, is(arrayContaining(allOf(
// Contain an address which matches the one we advertised (culling those which might
// be registered by other tests which happen to run at the same time.)
hasProperty("inetAddresses", arrayContaining(sameAddressAs(address))),
// Match the parameters we specified in the call to list.
hasProperty("application", equalTo("test")),
hasProperty("protocol", equalTo("tcp")),
hasProperty("domain", equalTo("local")),
// Match the info we advertised.
hasProperty("port", equalTo(9999)),
hasCustomProperty("key", "value")
))));
}
}
}
private static Matcher<InetAddress> sameAddressAs(final InetAddress address)
{
return new TypeSafeMatcher<InetAddress>()
{
@Override
protected boolean matchesSafely(InetAddress inetAddress)
{
return Arrays.equals(address.getAddress(), inetAddress.getAddress());
}
@Override
public void describeTo(Description description)
{
description.appendText("same address as ");
description.appendValue(address.getHostAddress());
}
};
}
private static Matcher<ServiceInfo> hasCustomProperty(final String key,
final String value)
{
return new TypeSafeMatcher<ServiceInfo>()
{
@Override
protected boolean matchesSafely(ServiceInfo serviceInfo)
{
return value.equals(serviceInfo.getPropertyString(key));
}
@Override
public void describeTo(Description description)
{
description.appendText("has custom mDNS property ");
description.appendValue(key);
description.appendText(" = ");
description.appendValue(value);
}
};
}
在调试器中,我可以看到它没有将套接字绑定(bind)到任何特定地址,只是绑定(bind)到特定端口。但随后它会将其设置为特定的接口(interface)。
我在 Wireshark 中看到的是,数据包来 self 的计算机的公共(public) IP(en0 地址),即使 lo0 是我用于测试的接口(interface)。我还看到查询和响应数据包。回复正在返回。
但是在 Java 端,我看到它调用 DatagramSocket#receive(DatagramPacket)
并且从未收到数据包。
(我也花了半天时间寻找 JmDNS 的替代品,但看起来其他声称可以替代它的库实际上还不能进行多播,这使得它们有点毫无意义。:( )
这是怎么回事?
最佳答案
发生的事情是 OS X 中内置的 Zeroconf 服务正在获取数据包。
JmDNS 假定它是在监听该端口的计算机上运行的唯一守护进程。因为它使用的代码故意绑定(bind)到 0.0.0.0,所以不会抛出有关正在使用的端口的异常(显然这是 Socket API 的一个“功能”。)
对于 Windows,这工作正常,因为永远不会有另一个 Zeroconf 守护进程在运行。
对于 Mac OS X,它肯定会失败,因为内置的总是在运行。
我猜想在 Linux 上,您会得到不同的结果,具体取决于您运行的发行版以及安装的服务。
我正在解决的问题的解决方案是在 CFNetServices 之上创建一个完全不同的 API .
关于java - JmDNS 似乎在 Mac OS X 上根本不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19533979/
我正在尝试 jmDNS jar ,但是当我运行我的应用程序时,它会抛出类似 NoClassDefFoundError: javax.jmdns.JmDNS 的错误。 它从这一行抛出错误 jm
希望我的问题不是太愚蠢,但我遇到了以下问题...... 我正在将一个包含库 JmDNS 的 jar 导入到我的项目中。我的项目设置为像这样处理 JmDNS... setUp();
我正在使用 JmDNS 在网络中同一子网下的几台计算机中注册服务。然而,每次第二台机器启动并尝试注册服务时,其名称都会自动更改为“service_name(编号)”之类的名称。我认为发生这种情况是为了
我有一个我认为非常简单的问题。 我正在尝试使用 JmDNS 来广播我已经成功完成的服务,但是当应用程序暂停时,我想取消注册服务,然后在恢复应用程序时重新注册服务。 然而,我在执行此操作时遇到了问题。代
我已经能够获取 JmDNS 附带的示例来编译和运行,但是我无法获取任何类来发现我的服务。 我正在运行一个 Windows 环境,多台 PC 运行 VNC、SSH 和 Apache,我一直在尝试让 Jm
我正在尝试为 Android 应用程序和桌面应用程序之间的通信实现 JmDNS 发现。我遵循了以下教程: http://home.heeere.com/tech-androidjmdns.html A
我正在尝试使用 JmDNS 来检测网络上设备的添加和删除。添加工作正常,一旦设备各自的服务在 JmDNS 中注册,就会找到这些设备,但是,当设备从网络中删除时,它永远不会在 JmDNS 中注册。 我曾
我正在尝试实现一个类来发现网络上的服务。我试过使用 Android's NSD它确实发现服务很好,但它只支持 API 级别 16 及更高级别,而且我似乎无法检索服务信息中的 txtRecord 字段(
使用jmdns 3.4.1,我可以看到局域网中机器发布的服务,我也可以创建一个服务并注册它,这样我就可以在我的机器上看到它。但是,当我在局域网的另一台机器上新建服务时,在我的机器上是看不到的。我在另一
我已经创建了 JmDNS 示例: public class Service { public static void main(String[] args) { try { J
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我已经在我的 linux 电脑上使用 mdnsreponder(applebonjour) 为我的服务注册了子类型 .我正在尝试在我的 Galaxy 手机上使用 jmdns(这里我有 jmdns.ja
您好,我创建了示例 jmdns serviceListner,当我运行它时,它应该继续列出它找到的服务,但是通过这个我的程序,它在运行时列出了一些服务,之后它不列出任何服务。而且我的 google
我正在使用 ( http://jmdns.sourceforge.net/) 将发现添加到我们的应用程序中。它实际上在我的小型家庭网络上正常工作。但它在办公室的大型网络上失败了。我似乎记得读过,如果一
我在 Raspberry Pi 设备上启动并运行 JmDNS 时遇到问题。该应用程序在各种 x86 Linux 上运行良好,但在 Raspberry(运行“Raspbian GNU/Linux 8 (
我正在尝试让 JmDNS 在我的 android 程序中工作。我能够让它发现我想要的设备,但我不完全理解如何从 JmDNS 获取信息到启动 JmDNS 任务的对象。这是我的代码。 protected
我在让 JmDNS 与我的 Android AVD 一起工作时遇到了一些困难。我创建了 3 个应用程序。一个注册 ServiceListener 并记录任何 Activity 的 Android 应用
我正在用 Java(使用 Spark)开发一个 Web 应用程序,我希望它使用 JmDNS 以便能够在我的 Android 应用程序中找到此服务器。我按照 JmDNS page 中的步骤进行服务注册,
我正在通过其他运行 windows-xp 的机器创建 JmDNS 服务 JmDNS dns = JmDNS.create("localhost"); dns.regesterService("_sre
前言:从 SDK 级别 16 开始,Android 有一个内置的 Zeroconf 实现。除非青铜时代的兼容性是一个问题,否则不要再使用 jmDNS,而是使用 NsdManager。 前言 #2:Ns
我是一名优秀的程序员,十分优秀!