这真的让我很头疼,我希望有人能解决我的问题。
我正在尝试使用 Cocoa 学习分布式对象、bonjour 等。
我可以让事情正常运行,但只有一个案例让我很恼火,我不明白为什么会这样。
我正在尝试设置一个用 Bonjour 做广告的 DO 服务器。
这是相关的服务器代码:
- (void) startServer
{
NSSocketPort *socket = [[NSSocketPort alloc] init];
pubService = [[NSNetService alloc] initWithDomain:@"local." type:@"_myservice._tcp" name:@"my_server" port:[socket socket]];
[pubService publish];
theConnection = [[NSConnection alloc] initWithReceivePort:socket sendPort:nil];
[theConnection setRootObject:self];
[[NSSocketPortNameServer sharedInstance] registerPort:socket name:@"my_server"];
[theConnection setDelegate:self];
[theConnection retain];
}
对于客户端,我将跳过一些代码示例,我使用 NSNetServiceBrowser 并搜索适当的服务。它发现服务(NSNetService)正常。我在服务上调用resolveWithTimeout,效果也很好。
解决服务后,我尝试连接到它。
如果我这样连接:
- (void) connect:(NSNetService *) service;
{
NSLog(@"Remote is %@ [%@] [%d]",[service hostName],[service name],[service port]);
NSSocketPort *port = (NSSocketPort *) [[NSSocketPortNameServer sharedInstance] portForName:[service name] host:[service hostName]];
connection = [[NSConnection connectionWithReceivePort:nil sendPort:port] retain];
@try
{
clientObject = (NSDistantObject<DOProtocol>*) connection.rootProxy;
}
@catch (id exception) {
NSLog(@"Caught exception %@",exception);
}
}
然后一切正常,clientObject 被初始化,我们都很高兴。
但是如果我这样做 - “手动”创建一个远程 TCPPort 而不是使用 NSSocketPortNameServer:
- (void) connect:(NSNetService *) service;
{
NSLog(@"Remote is %@ [%@] [%d]",[service hostName],[service name],[service port]);
NSSocketPort *port = [[NSSocketPort alloc] initRemoteWithTCPPort:[service port] host:[service hostName]];
connection = [[NSConnection connectionWithReceivePort:nil sendPort:port] retain];
@try
{
clientObject = (NSDistantObject<DOProtocol>*) connection.rootProxy;
}
@catch (id exception) {
NSLog(@"Caught exception %@",exception);
}
}
然后对connection.rootProxy的调用总是抛出异常:“ [NSPortCoder sendBeforeTime:sendReplyPort:] timed out ”
这是为什么?
我可以在两个不同的端口对象上执行的所有日志记录显示它们之间没有差异,但一项工作,一项没有。
我希望有人能解释一下。我在这个网站上所做的所有搜索都向人们展示了一些类似的东西,但我找不到解决我问题的答案,或者告诉我为什么会这样。
谢谢!
编辑:只是为了澄清......我尝试这样做的原因是我很好奇它是否可以在不使用 NSSocketPortNameServer 的情况下完成。