对于Mac,我尝试使用NSConnection代理从一个应用程序实例访问同一个主机上的另一个应用程序实例。相关代码如下。如果需要的话我可以提供更多。假设当我说"server“时,我指的是实际使用NSConnection”销售“对象的应用程序。"client“是同一个应用程序的另一个实例,它获得了一个代理。
一切正常,除了两个问题。
stopLocalServer函数,以前连接并得到代理对象的任何客户端应用程序仍然能够在服务器应用程序上发送消息和调用代码。在服务器调用NSConnection:invalidate之后传递消息时,我希望客户端会抛出异常。如何在不要求服务器进程退出的情况下强行断开任何客户端?startClientConnection代码中,如果服务器从一开始就没有使用预期的注册名称来支持对象,那么对客户端对NSConnection:connectionWithRegisteredName:host的调用将立即返回零。这很好。但是,如果服务器已经开始通过下面的startLocalServer代码自动出售一个对象,那么以后不再用stopLocalServer来销售它,随后的客户端连接尝试将挂起(永远阻塞),直到服务器应用程序进程退出为止。对NSConnection的调用:connectionWithRegisteredName返回一个非零对象,但是对[_clientConnection rootProxy]的调用将永远挂起,直到服务器应用程序实际退出。我怀疑我没有正确地撕毁原始的NSConnection对象,或者我在这里缺少一些基本的东西。
下面是我的用户界面代码所在的平台的一些相关代码:
-(void)startLocalServer:(NSString*)str
{
[self stopLocalServer]; // clean up any previous instance that might be running
_serverConnection = [NSConnection new];
[_serverConnection setRootObject:self];
[_serverConnection registerName:str];
}
-(void)stopLocalServer
{
[_serverConnection registerName:nil];
[_serverConnection setRootObject:nil];
[_serverConnection invalidate];
_serverConnection = nil;
}
-(void)startClientConnection:(NSString*)str
{
[self stopClientConnection]; // tear down any previous connection
_clientConnection = [NSConnection connectionWithRegisteredName:str host:nil];
if ((_clientConnection == nil) || (_clientConnection.valid == NO))
{
LogEvent(@"ERROR - _clientConnection is nil or invalid!");
}
else
{
_proxy = [_clientConnection rootProxy];
}
}
-(void)stopClientConnection
{
_proxy = nil;
[_clientConnection invalidate];
_clientConnection = nil;
}发布于 2015-07-05 09:32:17
回答我自己的问题。我仍然会坚持一个更好的答案,或者,如果有人能更好地解释为什么需要这样做的理由。
我认为stopLocalServer函数需要调用[[_serverConnection receivePort] invalidate],以便关闭使用连接创建的端口。只要将这一行添加到原始的stopLocalServer函数中,就可以解决我的问题。这将阻止进一步的连接尝试和消息的成功。
更恰当的是,应用程序调用可以只拥有NSConnection使用的端口。因此,这将成为启动和停止分布式对象侦听器的更好解决方案:
-(void)startLocalServer:(NSString*)str
{
[self stopLocalServer]; // clean up any previous instance that might be running
_port = [NSPort port]; // _port is of type NSPort*
_serverConnection = [NSConnection connectionWithReceivePort:_port sendPort:nil];
[_serverConnection setRootObject:self];
[_serverConnection registerName:str];
}
-(void)stopLocalServer
{
[_serverConnection registerName:nil];
[_serverConnection setRootObject:nil];
[_serverConnection invalidate];
_serverConnection = nil;
[_port invalidate];
_port = nil;
}这似乎解决了上面的#1和#2。
https://stackoverflow.com/questions/31226608
复制相似问题