可可分布式对象中的双向通信

Posted

技术标签:

【中文标题】可可分布式对象中的双向通信【英文标题】:Bidirectional communication in Distributed Objects in cocoa 【发布时间】:2015-08-12 13:46:10 【问题描述】:

我是 Cocoa 编程的新手……我正在学习使用分布式对象的 IPC。 我做了一个简单的例子,我从服务器出售对象并在客户端调用它们。我成功地将消息从客户端对象传递到服务器但我想将消息从服​​务器传递到客户端[双向]...如何我应该这样做吗?

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 

MYMessageServer   *server = [[MYMessageServer alloc] init];
NSConnection      *defaultConnection=[NSConnection defaultConnection];


[defaultConnection setRootObject:server];
   if ([defaultConnection registerName:@"server"] == NO)

    NSLog(@"Error registering server");

else
    NSLog(@"Connected");
[[NSRunLoop currentRunLoop] configureAsServer];


- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
// Insert code here to initialize your application

//Getting an Vended Object
server = [NSConnection rootProxyForConnectionWithRegisteredName:@"server" host:nil];


if(nil == server)

    NSLog(@"Error: Failed to connect to server.");

else


    //setProtocolForProxy is a method of NSDistantObject
    [server setProtocolForProxy:@protocol(MYMessageServerProtocol)];
    [server addMessageClient:self];
    [server broadcastMessageString:[NSString stringWithFormat:@"Connected: %@ %d\n",
                                    [[NSProcessInfo processInfo] processName],
                                    [[NSProcessInfo processInfo] processIdentifier]]];

- (void)appendMessageString:(NSString *)aString

NSRange    appendRange = NSMakeRange([[_messageView string] length], 0);

// Append text and scroll if neccessary
[_messageView replaceCharactersInRange:appendRange withString:aString];
[_messageView scrollRangeToVisible:appendRange];

- (void)addMessageClient:(id)aClient

if(nil == _myListOfClients)

    _myListOfClients = [[NSMutableArray alloc] init];

[_myListOfClients addObject:aClient];
NSLog(@"Added client");

- (BOOL)removeMessageClient:(id)aClient

[_myListOfClients removeObject:aClient];
NSLog(@"Removed client");
return YES;

- (void)broadcastMessageString:(NSString *)aString

NSLog(@"Msg is %@",aString);
self.logStatement = aString;
[_myListOfClients makeObjectsPerformSelector:@selector(appendMessageString:)
                                  withObject:aString];

@protocol MYMessageServerProtocol
- (void)addMessageClient:(id)aClient;
- (BOOL)removeMessageClient:(id)aClient;
- (void)broadcastMessageString:(NSString *)aString;

【问题讨论】:

上面的代码工作得很好......我可以将消息从客户端传递到服务器......我想在同一个应用程序中将消息从服​​务器传递到客户端......请帮忙! 【参考方案1】:

您没有显示MYMessageServerMYMessageServerProtocol 的代码,特别是-addMessageClient: 方法。但是,一旦您向服务器传递了对客户端中对象的引用,服务器就可以像往常一样向该对象发送消息,并且该消息将通过 D.O. 发送。给客户。

因此,客户端通过-addMessageClient:self(其应用程序委托)发送到服务器。服务器可以简单地调用它在其-addMessageClient: 的实现中接收到的对象上的方法,这将调用客户端的应用程序委托对象上的方法。服务器可以将该引用保存在某处,例如实例变量中的一组客户端,并且如果需要,也可以在以后继续向客户端发送消息。服务器将希望在连接关闭时清除该引用,它可以从NSConnection 发布的通知中检测到。

【讨论】:

好的,怎么了?您正在保留客户列表并向他们发送消息。 @iBuilt 如果你有机会,我很想在 GitHub 上看到这个。同时,一种方法是使用投票技术。因此,您可以使用异步方法启动一个进程(在客户端和服务器的类方法声明中使用 (oneway void)),然后使用同步方法(不带 oneway 关键字的方法)再次检查服务器。与双向相比,这可能更少的代码和更少的麻烦?

以上是关于可可分布式对象中的双向通信的主要内容,如果未能解决你的问题,请参考以下文章

使用 Websocket 的两个设备之间的双向通信

C ++ Boost TCP通道上的序列化对象,双向通信不起作用

独立程序的多对一双向通信

TCL:Windows中线程之间的双向通信

Dart 2 中与隔离物的双向通信

Flutter与Android iOS 的双向通信