2

Bonjour が提供する便利な方法がありますDNSSD.browse("_killerapp._tcp", this);。このメソッドの最初の引数として、ネットワークで利用できる可能性のあるサービスのタイプを指定し、2 番目の引数として「コールバック オブジェクト」を指定します。指定されたタイプ (最初の引数) のサービスに対して考慮されるメソッド「browse」。

ブラウジング中に、サービスを「見つけて」「失う」ことがあります。サービスが見つかった (失われた) 場合、bonjour はコールバック オブジェクトの serviceFound (serviceLost) メソッドを呼び出します。serviceFound は、見つかったサービスのいくつかのパラメーターを使用して呼び出されます。詳細は次のとおりです。

serviceFound(DNSSDService browser, int flags, int ifIndex, String serviceName, String regType, String domain)

しかし、サービスの IP アドレスとポートを取得するには、追加の操作を行う必要があります (人々はこれを「サービスを解決する」と呼んでいます)。これは私にとって奇妙な論理です。この情報を serviceFound で提供できないのはなぜですか? Bonjour がサービスを見つけるたびにサービスを自動的に解決できない理由を意味します。

とにかく、与えられたロジックを受け入れて、それを使おうとします。serviceFoundI callからDNSSD.resolve(0, ifIndex, serviceName, regType, domain, this)

前と同じように、コールバック オブジェクトをresolve(最後の引数) に渡します。残念ながら、 と のコールバック オブジェクトを提供するには、別のクラスを使用する必要がありbrowseますresolve。その理由は、browseresolveがコールバック オブジェクトのメソッドを呼び出すことができるためですoperationFailed。同じクラスのコールバック オブジェクトを使用すると、どのメソッドがoperationFailed(browseまたはresolve) を呼び出しているかわかりません。

そのため、別のクラスを作成して、resolveメソッドのコールバック オブジェクトをインスタンス化します。このクラスにはserviceResolved、解決されたサービスの IP アドレスとポートを使用して Bonjour によって呼び出されるメソッドがあります。

serviceResolved(DNSSDService resolver, int flags, int ifIndex, String fullname, String hostname, int port, TXTRecord txtRecord)

IPアドレスとポートはブラウジングを行うオブジェクトのフィールドにすべきだと思います。そのため、serviceResolvedIP とポートがあり、これらの値を、サービスを提供するインスタンスの対応するフィールドに設定したいと考えていbrowseます。しかし、どうすればそれができますか?このインスタンスは、serviceResolvedメソッドの引数として渡されません。だから、それは見えません!

さらに、serviceResolved と serviceFound が最初の引数としてDNSSDService resolver. 誰がそれが何であるか知っていますか?このオブジェクトを使用して、サービスのパラメーターを設定できますか? このタイプのオブジェクトが によって返されることはわかっていますbrowse

4

1 に答える 1

0

実際には答えではありませんが、Bonjourライブラリの他に、純粋なJavaのオープンソースモジュールであるJmDNSを試してみることをお勧めします。

于 2010-06-23T06:19:00.023 に答える