Исключение распределенного объекта Какао при создании удаленного NSSocketPort вручную - PullRequest
0 голосов
/ 08 июля 2010

Это действительно делает мою голову, я надеюсь, что кто-то может решить мою проблему.

Я пытаюсь изучить распределенный объект, бонжур и т. Д. С Какао.

Я могу приступить к работе, но меня раздражает только один случай, я не понимаю, почему это происходит.

Я пытаюсь настроить сервер 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.

Ответы [ 2 ]

0 голосов
/ 22 июля 2010

mvds, вот результат сравнения двух выходов msgSends.

diff msgSends-NOTWORKING msgSends-WORKING

9a10
> + AppController NSObject instanceMethodSignatureForSelector:
573a575
> + NSData NSData dataWithBytesNoCopy:length:freeWhenDone:
640a643
> + NSDistantObject NSDistantObject newDistantObjectWithCoder:
770,777d772
< + NSException NSException exceptionWithName:reason:userInfo:
< + NSException NSException raise:format:
< + NSException NSException raise:format:arguments:
< + NSException NSObject alloc
< + NSException NSObject allocWithZone:
< + NSException NSObject initialize
< + NSException NSObject resolveInstanceMethod:
< + NSException NSObject self
1076a1072,1073
> + NSMachPort NSObject class
> + NSMachPort NSObject initialize
1143a1141
> + NSMessageBuilder NSMessageBuilder initialize
1273d1270
< + NSNumber NSNumber numberWithInt:
1287a1285
> + NSObject NSObject instanceMethodSignatureForSelector:
1435a1434,1435
> + NSPortMessage NSObject allocWithZone:
> + NSPortMessage NSObject initialize
1749d1748
< + NSTextInputContext NSTextInputContext _applicationDeactivated:
1808,1809d1806
< + NSThread NSThread callStackReturnAddresses
< + NSThread NSThread callStackSymbols
2010,2014d2006
< + _NSCallStackArray NSArray allocWithZone:
< + _NSCallStackArray NSObject alloc
< + _NSCallStackArray NSObject initialize
< + _NSCallStackArray NSObject new
< + _NSCallStackArray _NSCallStackArray arrayWithFrames:count:symbols:
2374d2365
< - AppController NSObject isEqual:
2607d2597
< - NSApplication NSApplication _setMouseActivationInProgress:
3245d3234
< - NSCFNumber NSCFNumber intValue
3812,3813d3800
< - NSComboBox NSView _drawRectIfEmpty
< - NSComboBox NSView _drawRectIfEmptyWhenSubviewsCoverDirtyRect:
4094d4080
< - NSComboBoxWindow NSWindow _deactivateTrackingRectsForApplicationDeactivation
4687a4674,4675
> - NSConcreteData NSData isEqual:
> - NSConcreteData NSData isEqualToData:
4755a4744
> - NSConcreteMutableData NSData isNSData__
4794a4784,4785
> - NSConcretePortCoder NSCoder allowsKeyedCoding
> - NSConcretePortCoder NSCoder decodeObject
4796a4788,4792
> - NSConcretePortCoder NSConcretePortCoder decodeBytesWithReturnedLength:
> - NSConcretePortCoder NSConcretePortCoder decodeRetainedObject
> - NSConcretePortCoder NSConcretePortCoder decodeReturnValue:
> - NSConcretePortCoder NSConcretePortCoder decodeValueOfObjCType:at:
> - NSConcretePortCoder NSConcretePortCoder dispatch
4800a4797
> - NSConcretePortCoder NSConcretePortCoder importObject:
4803a4801
> - NSConcretePortCoder NSConcretePortCoder versionForClassName:
4805a4804,4805
> - NSConcretePortCoder NSObject retain
> - NSConcretePortCoder NSObject zone
4830d4829
< - NSConcreteTextStorage NSObject autorelease
4849a4849
> - NSConnection NSConnection addClassNamed:version:
4850a4851
> - NSConnection NSConnection decodeReleasedProxies:
4851a4853,4854
> - NSConnection NSConnection handlePortCoder:
> - NSConnection NSConnection handleReleasedProxies:length:
4861a4865
> - NSConnection NSConnection sendReleasedProxies
4863a4868
> - NSConnection NSConnection versionForClassNamed:
4898a4904,4905
> - NSCountedSet NSCountedSet addObject:
> - NSCountedSet NSCountedSet countForObject:
4900a4908,4909
> - NSCountedSet NSCountedSet member:
> - NSCountedSet NSCountedSet removeObject:
4930a4940
> - NSDOStreamData NSDOStreamData bytes
4932a4943,4944
> - NSDOStreamData NSDOStreamData length
> - NSDOStreamData NSData isNSData__
4933a4946
> - NSDOStreamData NSObject retain
4949a4963
> - NSDistantObject NSDistantObject description
4953a4968,4969
> - NSDistantObject NSDistantObject retain
> - NSDistantObject NSDistantObject retainWireCount
4955a4972
> - NSDistantObject NSProxy respondsToSelector:
5098d5114
< - NSEvent NSEvent data2
5106a5123
> - NSEvent NSEvent trackingNumber
5116,5123d5132
< - NSException NSException dealloc
< - NSException NSException description
< - NSException NSException initWithName:reason:userInfo:
< - NSException NSObject autorelease
< - NSException NSObject class
< - NSException NSObject isKindOfClass:
< - NSException NSObject release
< - NSException NSObject respondsToSelector:
5251d5259
< - NSHelpManager NSHelpManager _orderOutHelpWindow
5338a5347
> - NSInvocation NSInvocation _addAttachedObject:
5340a5350
> - NSInvocation NSInvocation getReturnValue:
5342a5353,5355
> - NSInvocation NSInvocation setArgument:atIndex:
> - NSInvocation NSInvocation setSelector:
> - NSInvocation NSInvocation setTarget:
5346a5360
> - NSInvocation NSObject retain
5532d5545
< - NSLayoutManager NSLayoutManager _hasSeenRightToLeft
5559d5571
< - NSLayoutManager NSLayoutManager characterIndexForPoint:inTextContainer:fractionOfDistanceBetweenInsertionPoints:
5570d5581
< - NSLayoutManager NSLayoutManager fractionOfDistanceThroughGlyphForPoint:inTextContainer:
5575,5576d5585
< - NSLayoutManager NSLayoutManager glyphIndexForPoint:inTextContainer:
< - NSLayoutManager NSLayoutManager glyphIndexForPoint:inTextContainer:fractionOfDistanceThroughGlyph:
5578d5586
< - NSLayoutManager NSLayoutManager glyphRangeForBoundingRectWithoutAdditionalLayout:inTextContainer:
5744a5753
> - NSLevelIndicatorCell NSObject isEqual:
5939a5949
> - NSMethodSignature NSMethodSignature methodReturnType
6268a6279
> - NSObjectController NSObject isEqual:
6365d6375
< - NSPlaceholderNumber NSPlaceholderNumber initWithInt:
6379a6390,6391
> - NSPort NSObject dealloc
> - NSPort NSPort addConnection:toRunLoop:forMode:
6380a6393,6399
> - NSPortMessage NSObject release
> - NSPortMessage NSPortMessage components
> - NSPortMessage NSPortMessage dealloc
> - NSPortMessage NSPortMessage initWithSendPort:receivePort:components:
> - NSPortMessage NSPortMessage receivePort
> - NSPortMessage NSPortMessage sendPort
> - NSPortMessage NSPortMessage setMsgid:
6447a6467,6471
> - NSRunLoop NSRunLoop _addPort:forMode:
> - NSRunLoop NSRunLoop _containsPort:forMode:
> - NSRunLoop NSRunLoop _enumerateInfoPairsWithBlock:
> - NSRunLoop NSRunLoop _removePort:forMode:
> - NSRunLoop NSRunLoop addPort:forMode:
6448a6473
> - NSRunLoop NSRunLoop containsPort:forMode:
6450a6476
> - NSRunLoop NSRunLoop removePort:forMode:
6823a6850
> - NSSocketPort NSObject hash
6824a6852
> - NSSocketPort NSPort removeConnection:fromRunLoop:forMode:
6825a6854,6855
> - NSSocketPort NSSocketPort _handleMessage:from:socket:
> - NSSocketPort NSSocketPort _incrementUseCount
6828a6859
> - NSSocketPort NSSocketPort addConnection:toRunLoop:forMode:
6830a6862
> - NSSocketPort NSSocketPort handlePortMessage:
6836a6869
> - NSSocketPort NSSocketPort removeFromRunLoop:forMode:
6837a6871
> - NSSocketPort NSSocketPort scheduleInRunLoop:forMode:
6838a6873
> - NSSocketPort NSSocketPort setDelegate:
7035a7071
> - NSTempAttributeDictionary NSAttributeDictionary count
7334d7369
< - NSTextInputContext NSTextInputContext deactivate
7361,7362d7395
< - NSTextView NSTextView _cellForPoint:characterIndex:level:row:column:range:
< - NSTextView NSTextView _characterRangeBetweenIndexes:
7378,7379d7410
< - NSTextView NSTextView _getGlyphIndex:characterIndex:forWindowPoint:pinnedPoint:anchorPoint:useAnchorPoint:preferredTextView:partialFraction:
< - NSTextView NSTextView _getGlyphIndex:characterIndex:forWindowPoint:pinnedPoint:preferredTextView:partialFraction:
7388d7418
< - NSTextView NSTextView _selectedRanges
7391d7420
< - NSTextView NSTextView _setScrollingToEnd:
7405,7406d7433
< - NSTextView NSTextView becomeKeyWindow
< - NSTextView NSTextView becomeMainWindow
7441d7467
< - NSTextView NSTextView mouseDown:
7446d7471
< - NSTextView NSTextView resignKeyWindow
7450,7451d7474
< - NSTextView NSTextView selectionAffinity
< - NSTextView NSTextView selectionRangeForProposedRange:granularity:
7474d7496
< - NSTextView NSTextView setSelectionGranularity:
7523d7544
< - NSTextView NSView _disableTrackingArea:
7528d7548
< - NSTextView NSView _enableTrackingArea:
7552d7571
< - NSTextView NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:
7554d7572
< - NSTextView NSView _recursiveSetTrackingAreasDirty:
7573d7590
< - NSTextView NSView _windowChangedKeyState
7662d7678
< - NSThemeFrame NSObject isEqual:
7808,7809d7823
< - NSThemeFrame NSView _drawRectIfEmpty
< - NSThemeFrame NSView _drawRectIfEmptyWhenSubviewsCoverDirtyRect:
8042d8055
< - NSView NSResponder acceptsFirstResponder
8068,8069d8080
< - NSView NSView _drawRectIfEmpty
< - NSView NSView _drawRectIfEmptyWhenSubviewsCoverDirtyRect:
8130d8140
< - NSView NSView acceptsFirstMouse:
8159d8168
< - NSView NSView needsPanelToBecomeKey
8181d8189
< - NSView NSView shouldDelayWindowOrderingForEvent:
8259d8266
< - NSWindow NSWindow _deactivateTrackingRectsForApplicationDeactivation
8266d8272
< - NSWindow NSWindow _disableTrackingArea:
8280d8285
< - NSWindow NSWindow _enableTrackingArea:
8283d8287
< - NSWindow NSWindow _getPositionFromServer
8342d8345
< - NSWindow NSWindow _removeMouseMovedListener:
8398d8400
< - NSWindow NSWindow _updateMouseMovedState
8481d8482
< - NSWindow NSWindow nextEventMatchingMask:
8492,8493d8492
< - NSWindow NSWindow resignKeyWindow
< - NSWindow NSWindow resignMainWindow
8602,8606d8600
< - _NSCallStackArray NSObject autorelease
< - _NSCallStackArray NSObject init
< - _NSCallStackArray NSObject release
< - _NSCallStackArray NSObject retain
< - _NSCallStackArray _NSCallStackArray dealloc
8816d8809
< - _NSKeyboardFocusClipView NSView _enableOrDisableTrackingAreas
8843d8835
< - _NSKeyboardFocusClipView NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:
8867d8858
< - _NSKeyboardFocusClipView NSView _windowChangedKeyState
8882d8872
< - _NSKeyboardFocusClipView NSView hitTest:
0 голосов
/ 21 июля 2010

Цитируя apple.com, вы прочитали последнюю строку:

initRemoteWithTCPPort: хозяин:
Инициализирует приемник как сокет TCP / IP типа SOCK_STREAM, который может подключаться к удаленному хосту через указанный порт.
...
Соединение с удаленным хостом не открывается, пока данные не отправлены.

Не знаю много (т.е. ничего) о API NSSocket, но может случиться так, что вы никогда не отправляете один байт и, таким образом, ждете, чтобы ничего не произошло, и время ожидания.

...