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

问题描述:

我有一个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成为一个类,以便它作为代理被传递,但我不想真的那样做。

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

任何人都可以建议一个这样做的机制?

你在找什么是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

+0

是的,我实际上已经这样做了。问题是什么时候在连接上调用一个方法。被调用的方法如何确定连接。我需要类似[NSConnection currentConnection],它不存在。 – OzBandit 2011-06-13 21:14:55

+0

你可以尝试使用+ currentConversation – cocoafan 2011-06-15 07:02:23

+0

我也看过这个。它做一些稍微不同的事情,然后只有当NSConnection处于特定模式时。这可能会以某种方式使用它,但我需要探索围绕它的API。苹果公司的文档相当粗略。无论如何,谢谢你的答案。 – OzBandit 2011-06-16 05:10:00