如何找到特定分布式对象方法调用的连接?
问题描述:
我有一个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成为一个类,以便它作为代理被传递,但我不想真的那样做。
在我看来,如果我正在与原始套接字进行通信,我将能够找出哪个套接字消息进来,因此能够计算出哪个客户端发送它,而无需客户端发送作为消息的一部分的任何特殊内容。我需要一种方法来执行分布式对象方法调用。
任何人都可以建议一个这样做的机制?
答
你在找什么是NSConnection的delegate的方法。例如:
- (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
是的,我实际上已经这样做了。问题是什么时候在连接上调用一个方法。被调用的方法如何确定连接。我需要类似[NSConnection currentConnection],它不存在。 – OzBandit 2011-06-13 21:14:55
你可以尝试使用+ currentConversation – cocoafan 2011-06-15 07:02:23
我也看过这个。它做一些稍微不同的事情,然后只有当NSConnection处于特定模式时。这可能会以某种方式使用它,但我需要探索围绕它的API。苹果公司的文档相当粗略。无论如何,谢谢你的答案。 – OzBandit 2011-06-16 05:10:00