我创建了一个JmDNS实例,并使用registerService注册了服务。 然后,我启动一个发现服务的线程:
JmDNS jmdns=JmDNS.create();
....
jmdns.registerService(serviceInfo);
while (true) {
ServiceInfo[] infos = jmdns.list("_airport._tcp.local.");
System.out.println("List _airport._tcp.local.");
for (int i = 0; i < infos.length; i++) {
System.out.println(infos[i]);
}
System.out.println();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
break;
}
}
似乎jmdns.list(...)不返回相关服务。有时我没有获得任何已发布的服务,有时,如果我关闭了一项服务,则该服务仍会保留在列表中(几分钟后-我终止了该程序)。我感觉list()没有更新。...因此,我更新了如下代码,似乎可以正常工作。
while (true) {
jmdns=JmDNS.create();
ServiceInfo[] infos = jmdns.list("_airport._tcp.local.");
...
即使该解决方案似乎可行,但对于我来说,还是不清楚为什么我不能使用单个jmdns实例来发布和发现服务。我发现的jmdns代码不是纯粹的发布jmdns就是纯粹的发现jmdns-我没有找到“混合”示例。您能给我一个示例如何同时使用jmdns进行发布和发现吗?
编辑:的确,例如
jmdnsListener.addServiceListener("_airport._tcp.local.", new MyServiceListener());
没有帮助:每次都调用添加的Service事件-即使提供商已经终止