【问题标题】:How to find the connection for a particular distributed objects method invocation?如何找到特定分布式对象方法调用的连接?
【发布时间】:2011-09-12 19:11:30
【问题描述】:

我有一个 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 设为一个类,以便它作为代理传递,但我也不想真正这样做。

在我看来,如果我使用原始套接字进行通信,我将能够确定消息来自哪个套接字,因此能够确定哪个客户端发送它而无需客户端发送任何内容特别作为消息的一部分。我需要一种通过分布式对象方法调用来做到这一点的方法。

谁能提出一个这样做的机制?

【问题讨论】:

    标签: cocoa macos distributed-objects nsconnection


    【解决方案1】:

    您正在寻找的是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 来使用对话令牌

    【讨论】:

    • 是的,我实际上已经这样做了。问题是在连接上调用方法时。调用的方法如何确定连接。我需要 [NSConnection currentConnection] 之类的东西,但它不存在。
    • 你可以尝试使用+currentConversation
    • 我也见过这个。它做一些稍微不同的事情,然后只有当 NSConnection 处于特定模式时。可能以某种方式使用它,但我需要探索围绕它的 API。 Apple 文档对此相当粗略。无论如何,谢谢你的回答。
    • @David 我也有类似的问题 (is.gd/BilGbZ)。你找到解决办法了吗?
    • Raffi - 我最终不得不传递一个虚拟对象,或者通过更改远程对象提供的 API 来为虚拟对象找到服务的目的。我在最初的问题中提到了这一点。这并不理想,但它似乎是目前唯一的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2013-07-09
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多