我正尝试从Java使用Bonjour。我找到了一个如何去做的例子,我想我明白了。但我仍然不明白为什么它应该以这样复杂的方式来完成。可能是我想念什么。为什么它应该以如此复杂的方式完成?它是OOP的思维方式吗?
因此,code I found工作在以下方式(代码也在下面给出)。
Java程序试图找到一个服务,如果服务被发现,程序试图“解决”的服务(我认为“以解决服务”是指“使用服务”或“连接到服务“)。
要“解析”找到的服务,我们需要调用“DNSSD.resolve”方法,并且作为此方法的最后一个参数,我们需要提供一个对象。
“DNSSD.resolve”尝试解析给定的服务。如果“DNSSD.resolve”能够解析服务,它将调用作为最后一个参数给出的实例的“serviceResolved”方法。如果“DNSSD.resolve”无法解析服务,则ti调用上述对象的“operationFailed”方法。
下面是代码:
DNSSD.resolve(0, ifIndex, serviceName, regType, domain, new ResolveListener(){
public void serviceResolved(DNSSDService resolver, int flags, int ifIndex,
String fullname, String hostname, int port, TXTRecord txtRecord){
InetAddress theAddress;
try {
theAddress = InetAddress.getByName(hostname);
} catch (UnknownHostException e) {
// ouch..
}
}
public void operationFailed(DNSSDService arg0, int arg1) {
// ouch, again!
}
});
难道不更简单的组织以下列方式中的代码。
我们使用关于要解析的服务的信息调用“DNSSD.resolve”方法。
我们不会将任何对象传递给“DNSSD.resolve”。
“DNSSD.resolve”不调用任何类的任何方法。
“DNSSD.resolve”尝试“解析”给定的服务,并且在能够这样做的情况下,“DNSSD.resolve”返回true。否则它返回false。
程序根据“DNSSD.resolve”返回的值运行“serviceResolved”或“operationFailed”方法。
或者我只是不习惯OOP的思维方式?
但是在什么时候我会介绍这种“并行性”?在某个时候,程序调用DNSSD.resolve,我想,调用程序需要等到DNSSD解析服务。 – Roman 2010-03-07 17:16:25
不,DNSSD.resolve()立即返回,即使分辨率尚未完成。你的程序可以回到它的主循环处理GUI事件或其他任何东西。当解析完成时,您的处理程序对象会在单独的线程中被调用,并且您可以对该线程中的结果进行一些处理,或者将消息排队回到GUI线程以显示结果等。 – Wyzard 2010-03-07 17:43:19