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

标签 cocoa macos distributed-objects nsconnection

我有一个 Cocoa 客户端和服务器应用程序,它们使用通过 NSSocketPorts 和 NSConnections 以标准方式实现的分布式对象进行通信。服务器向客户端应用程序提供单个对象,其中可能有多个。每个客户端应用程序都可以通过自己的代理来访问同一分布式对象。

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

@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;
}

您可以为每个单独的连接设计一个对象(如 VendObjectProtocol)并通过 self.connection 获取连接。

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

或者

您可以使用 +createConversationForConnection 来使用对话 token :和+currentConversation

关于cocoa - 如何找到特定分布式对象方法调用的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6311820/

相关文章:

objective-c - Cocoa 中的分布式对象

objective-c - 从 NSMutableArray 中删除重复项

macos - 强制使用特定驱动程序的无代码 kext (CDC-ACM)

objective-c - 在 NSTableView 中实现拖放

c - OS X asl 日志记录 : how to re-direct messages of multi-threaded project into a single file

c++ - 具有毫秒精度的 Linux/OSX 时钟分辨率?

cocoa - 使用分布式对象出售对象并同步访问

objective-c - NSTextField + NSTimer

c# - Xamarin.Mac - 在窗口标题前显示图标/图像