2

我正在尝试使用 Java 中的 Bonjour。我找到了一个如何做的例子,我想我理解了。但我仍然不明白为什么要以如此复杂的方式完成。可能是我错过了什么。

所以,我发现的代码以下列方式工作(代码也在下面给出)。

  1. Java 程序尝试查找服务,如果找到该服务,程序会尝试“解析”该服务(我认为“解析服务”的意思是“使用服务”或“连接到服务”)。

  2. 要“解析”找到的服务,我们需要调用“DNSSD.resolve”方法,并且作为该方法的最后一个参数,我们需要提供一个对象。

  3. “DNSSD.resolve”尝试解析给定的服务。如果“DNSSD.resolve”能够解析服务,它会调用作为最后一个参数给出的实例的“serviceResolved”方法。如果“DNSSD.resolve”无法解析服务,则调用上述对象的“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!
                }
            });

用下面的方式组织代码会不会更简单。

  1. 我们使用有关我们要解析的服务的信息调用“DNSSD.resolve”方法。

  2. 我们不会将任何对象传递给“DNSSD.resolve”。

  3. “DNSSD.resolve”不调用任何类的任何方法。

  4. “DNSSD.resolve”试图“解析”给定的服务,如果它能够做到,“DNSSD.resolve”返回真。否则返回false。

  5. 程序根据“DNSSD.resolve”返回的值运行“serviceResolved”或“operationFailed”方法。

还是我只是不习惯 OOP 的思维方式?

4

6 回答 6

4

与其说是“OOP 思维方式”,不如说是“异步思维方式”。通过对可能需要一段时间的操作使用回调函数,您可以在等待操作完成时停止做其他事情(或保持 GUI 响应)。

于 2010-03-07T17:10:24.587 回答
4

当然,有很多不同的方法可以解决“问题”。这里采用的方法是一种回调方法:您调用 resolve 方法并给它一个方法(嗯,实际上是一个包含方法的对象,因为 Java 没有匿名方法或闭包等......)。一旦该解析器(未)成功解析了您希望它解析的任何内容,它将调用serviceResolved您提供给它的方法(然后对解析器提供的信息执行某些操作)。

这意味着它是一种异步方法,但不是 OO。您可以在解析器“工作”时执行其他操作,该serviceResolved方法将在某个时候调用因此您无需等待。

于 2010-03-07T17:16:09.550 回答
2

该代码也是Java-> JNI-> C代码。没有任何关于它的OO。它是带有 Java 包装器的异步过程代码。

于 2010-03-07T17:12:47.620 回答
1

DNSSD.resolve 的 JavaDoc 声明“大多数操作是非阻塞的;客户端通过带有操作结果的接口回调。回调由单独的工作线程进行。”

http://developer.apple.com/mac/library/documentation/Java/Reference/DNSServiceDiscovery_JavaRef/com/apple/dnssd/DNSSD.html

这就是并行性的来源。

于 2010-03-07T17:35:10.363 回答
0

回调接口样式常用于异步操作。

在设计接口,尤其是涉及网络或IO操作的服务时,经常会出现两个问题:1.操作是同步(阻塞)还是异步(非阻塞) 2.操作是否返回值

我们不能说回调样式是否是面向对象的。面向对象的设计是关于为每个对象分配明确的责任。

相反,回调机制是面向异步操作的OO设计中非常常见的模式。1. 负责提供规定服务的服务 2. 负责接收服务响应的回调

于 2010-06-23T06:29:59.063 回答
0

JBonjourBrowser中,您可以看到其他人引用的“异步方法”如何在JTree订阅者模型中使用。作者指出,这“特别有帮助......设备通常非常短暂,服务会在不久之后宣布并消失。

于 2010-03-07T18:16:10.997 回答