Objective-Cで分散オブジェクト(DO)を使用しています。ネットワーク上で販売した「サーバー」オブジェクトがあります。ネットワーク上の他のオブジェクトにはサーバーオブジェクトへのプロキシがあるため、サーバーオブジェクトのメソッドを呼び出すことができます。ただし、サーバーオブジェクトのメソッドを呼び出しているオブジェクトに関する情報を特定できますか?つまり、サーバーを呼び出すことができる多くの「クライアント」オブジェクトがあり、これらのオブジェクトを区別したいと思います。また、これらのオブジェクトに関する他の属性(ホスト名、一意の識別子など)を特定できますか?
2 に答える
この問題の最も効果的な解決策は、呼び出し元のオブジェクトへの参照を、たとえばメソッドの最初のパラメーターとして明示的に渡すことです。これにより、呼び出し元のオブジェクトを簡単に識別でき、必要に応じてコールバックすることもできます。結果の引数はタイプNSDistantObject *
です。
私も同様の問題を抱えていました。クライアントを識別するための可能な方法は、各呼び出しの一部として、ある種のトークンオブジェクトをサーバーに渡すことです。サーバーでは、次のことができます。
NSConnection* clientConnection = [passedTokenObject connectionForProxy];
これにより、各クライアントに固有の接続のハンドルが取得されます。必要な情報を入手できるかどうかは、Appleがその接続オブジェクトで何ができるかによって異なります。
私のアプリケーションでは、クライアントに最初に「登録」呼び出しを実行してもらいました。これは、クライアントについて必要な情報を収集するために使用しました。
他に役立つ可能性があるのは、サーバーオブジェクトの販売に使用するNSConnectionのNSConnectionDelegateになることです。これにより、次のメソッドにアクセスできるようになります。
- (BOOL)connection:(NSConnection *)parentConnection shouldMakeNewConnection:(NSConnection *)newConnnection {
// You can inspect new connection being established here and maybe glean info about the client
return YES;
}
- (BOOL) connection:(NSConnection *)c handleRequest:(NSDistantObjectRequest*)doReq {
// You get to see every method that is invoked here and can maybe glean info that you need.
// Returning NO means you're just snooping on the call and it will be handled in the normal way.
return NO;
}
利用可能な「ツール」は私が見つけたものでは十分ではなく、必要な情報を提供するために販売されたAPIを作り直す必要がありました。