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



我有一个Cocoa客户端和服务器应用程序,它们使用通过NSSocketPort和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的委托方法。例如:

- (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 来使用会话令牌

最新更新