4

標準的な方法で NSSocketPorts および NSConnections を介して実装された分散オブジェクトを使用して通信する Cocoa クライアントおよびサーバー アプリケーションがあります。サーバーはクライアント アプリケーションに 1 つのオブジェクトを提供します。各クライアント アプリケーションは、独自のプロキシを取得して、同じ分散オブジェクトにアクセスできます。

vended オブジェクトは、次のようなメソッドを含む特定のプロトコルをサポートします。

@protocol VendedObjectProtocol
- (void) acquireServerResource:(ServerResourceID)rsc;
@end

クライアント アプリケーションがこのメソッドを呼び出すと、サーバーは要求されたリソースをそのクライアント アプリケーションに割り当てる必要があります。しかし、同じリソースを要求する複数のクライアントが存在する可能性があり、サーバーはどのクライアントがそれを要求したかを追跡する必要があります。

サーバー側でできるようにしたいのは、クライアントのメソッド呼び出しで使用される NSConnection を決定することです。どうやってやるの?

私が考えた1つの方法はこれです(サーバー側):

- (void) acquireServerResource:(ServerResourceID)rsc withDummyObject:(id)dummy {
    NSConnection* conn = [dummy connectionForProxy];
    //  Map the connection to a particular client
    //  ...
}

ただし、(クライアントの観点から) 実際の目的もなく、クライアントがダミー オブジェクトを通過する必要はありません。ServerResourceID をクラスにして、プロキシとして渡されるようにすることもできますが、実際にはそうしたくありません。

生のソケットで通信を行っていれば、メッセージがどのソケットに届いたかを把握できるため、クライアントが特別なものを送信しなくても、どのクライアントがメッセージを送信したかを判断できるように思えます。メッセージの。分散オブジェクト メソッドの呼び出しでこれを行う方法が必要です。

誰でもこれを行うためのメカニズムを提案できますか?

4

1 に答える 1

0

探しているのはNSConnectionデリゲートメソッドです。例えば:

- (BOOL)connection:(NSConnection *)parentConnection shouldMakeNewConnection:(NSConnection *)newConnnection {
 // setup and map newConnnection to a particular client 
 id<VendedObjectProtocol> obj = //...
 obj.connection = newConnection;
 return YES;
}

個々の接続 (VendedObjectProtocol など) ごとにオブジェクトを設計し、self.connection で接続を取得できます。

- (void) acquireServerResource:(ServerResourceID)rsc {
    NSConnection* conn = self.connection;
    //  Map the connection to a particular client
    //  ...
}

または

+createConversationForConnection : および+ currentConversationを使用して会話トークンを利用できます。

于 2011-06-13T20:39:16.537 に答える