Это действительно делает мою голову, я надеюсь, что кто-то может решить мою проблему.
Я пытаюсь изучить распределенный объект, бонжур и т. Д. С Какао.
Я могу приступить к работе, но меня раздражает только один случай, я не понимаю, почему это происходит.
Я пытаюсь настроить сервер 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) в порядке.Я называю resolWithTimeout на сервисе, и это тоже хорошо работает.
Когда служба разрешена, я пытаюсь подключиться к ней.
если я подключаюсь так:
- (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:] истекло время ожидания "
Почему это так?
Все журналы, которые я могу сделать на двух разных объектах порта, не показывают различий между ними, но одна работа, другая - нет.
Надеюсь, кто-нибудь сможет пролить свет.Все поиски, которые я проводил по этому показу, показывают людей с похожим, но я не могу найти ответ, который решает мое дело или говорит мне, почему это происходит.
Спасибо!
РЕДАКТИРОВАТЬ: просто чтобыуточнить ... причина, по которой я пытаюсь это сделать, заключается в том, что мне просто любопытно, можно ли это сделать без использования NSSocketPortNameServer.