如何查找特定分布式对象方法调用的连接?

时间:2011-06-10 20:40:30

标签: cocoa macos distributed-objects nsconnection

我有一个Cocoa客户端和服务器应用程序,它使用以标准方式通过NSSocketPorts和NSConnections实现的分布式对象进行通信。服务器将单个对象转发给客户端应用程序,其中可能有几个。每个客户端应用程序都可以访问相同的分布式对象,从而获得自己的代理。

售卖对象支持特定协议,其中包括类似于以下的方法:

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

当客户端应用程序调用此方法时,服务器应该将请求的资源分配给该客户端应用程序。但是可能有几个客户端请求相同的资源,服务器需要跟踪哪些客户端请求了它。

我希望能够在服务器端执行的操作是确定客户端方法调用所使用的NSConnection。我怎么能这样做?

我想到的一种方法是(服务器端):

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

但是,我真的不希望客户端必须通过虚拟对象而不是真正的目的(从客户端的角度来看)。我可以使ServerResourceID成为一个类,以便它作为代理传递,但我也不想真的这样做。

在我看来,如果我正在与原始套接字进行通信,我将能够找出消息所在的套接字,从而能够找出哪个客户端发送它而无需客户端发送任何内容特别作为信息的一部分。我需要一种方法来执行分布式对象方法调用。

有人可以建议这样做的机制吗?

1 个答案:

答案 0 :(得分:0)

您正在寻找的是NSConnectiondelegate方法。例如:

- (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

来使用会话令牌