Je me suis donné un mal de tête en essayant de comprendre comment exécuter cette démo d'objets distribués. Je peux l'exécuter très bien localement sur la même machine.Cocoa Distributed Objects
Voici la situation. J'ai une application serveur qui engendre une application client [avec OpenGLView] sur une machine distante.
Je peux le faire facilement avec AppleScript.
L'application client semble Vend sa fenêtre OpenGLView OK:
clientPort = [[NSSocketPort alloc] initWithTCPPort:SERVER_PORT];
if(clientPort == nil) continue; else NSLog(@"Port OK");
clientConnection = [NSConnection connectionWithReceivePort:clientPort sendPort:nil];
if(clientConnection == nil) continue; else NSLog(@"Conn OK");
[[NSSocketPortNameServer sharedInstance] registerPort:clientPort name:@"DOTest3_0"];
//Vend Object
@try {
[clientConnection setRootObject:object];
NSLog([NSString stringWithFormat:@"Port %d: Vend OK", (SERVER_PORT + i)]);
return;
} @catch (...) {
NSLog([NSString stringWithFormat:@"Port %d: Vend Next", (SERVER_PORT + i)]);
}
Le serveur App trouve le port et la connexion, mais soulève une exception TimeOut:
// Create temporary Pointer to kGLView Object.
id <NSCoding, kGLViewProtocol> openGLView;
// Setup Port, Connection, & Proxy
portTest = (NSSocketPort *)[[NSSocketPortNameServer sharedInstance] portForName:@"DOTest3_0" host:@"*"];
if (portTest == nil) continue ; else NSLog(@"Port OK");
connTest = [NSConnection connectionWithReceivePort:nil sendPort:portTest];
if (connTest == nil) continue ; else NSLog(@"Conn OK");
openGLView = [[connTest rootProxy] retain];
if (openGLView == nil) continue ; else NSLog(@"OpenGL OK");
[openGLView drawWithRotation: rotationAngle];
}
Et je ne peux pas pour la vie de Moi POURQUOI.
je reçois dans la console du PC Client: "Port OK" "Conn OK" "Port 8081: Vend OK"
je reçois dans la console du serveur PC: « Port OK " "Conn OK" 11/18/09 14:05:36 DOTest3 [15278] [NSPortCoder sendBeforeTime: sendReplyPort:] a expiré (10280263936,092180 280263936,092642) 1
Même si les délais d'attente sont tous deux situés à 60 secondes .
Aide!
-Stephen
Serveur: MacMini OS X 10.5 Client: MacPro OS X 10.6 Connexion à distance, gestion, etc. sont tous activés.
EDIT: Prenant la suggestion de NSResponder, j'ai VENDUS le contrôleur, mais il ne fonctionne toujours pas.
Client/Vender:
-(void)vend:(id)object {
port = [[[NSSocketPort alloc] initWithTCPPort:[self tcpPort]]
retain];
conn = [[NSConnection connectionWithReceivePort:port sendPort:nil]
retain];
for (int i = 0; i < 10; i++) {
[[NSSocketPortNameServer sharedInstance] registerPort:port
name:[[self portName] stringByAppendingFormat:@"_%d", i]];
@try {
[conn setRootObject:object];
return;
} @catch (...) {
NSLog(@"Vend Next");
continue;
}
}
NSLog(@"Vend Failed");
}
contrôleur client:
-(id)init {
self = [super init];
[self setRotationAngle:0.0f];
clientObj = [[Client alloc] initWithName:@"DOTest4"
Address:@"10.10.5.104" // mini
Port:48557];
[clientObj vend:self];
return self;
}
contrôleur de serveur:
-(IBAction)rotateClient:(id)sender {
NSArray *vendedObjects = [serverObj getVendedObjects];
id <NSCoding, ClientController_Protocol> proxy;
if (vendedObjects != nil) {
for (int i = 0; i < [vendedObjects count]; i++) {
proxy = [vendedObjects objectAtIndex:i];
[proxy rotate];
}
}
// release
[vendedObjects release];
}
/serveur (grappins objets voie publique)
-(NSArray *)getVendedObjects {
NSArray *vendedObjects = [[[NSArray alloc] init] retain];
NSSocketPort *port;
NSConnection *conn;
for (int i = 0; i< 10; i++) {
// Get Port Object
port = (NSSocketPort *)[[NSSocketPortNameServer sharedInstance]
portForName:[[self portName] stringByAppendingFormat:@"_%d", i]
host:[self addressRemote]];
if (port == nil) continue;
// Create Connection with Timeouts
conn = [NSConnection connectionWithReceivePort:nil sendPort:port];
if (conn == nil) continue;
[conn setReplyTimeout:(NSTimeInterval)60.0];
[conn setRequestTimeout:(NSTimeInterval)60.0];
// Get VendedObject of Connection
vendedObjects = [[vendedObjects arrayByAddingObject:[conn rootProxy]] retain];
}
return vendedObjects;
}
Soupir ... Je suis sûr que je suis juste sur quelque chose de vraiment cacao-basique ici.
-S!
SIGH ... qui fonctionne. Mon problème était de retourner le NSArray d'objets NSDistance. Quelque chose s'est dérangé quelque part. L'exécution de la commande 'rotate' dans la méthode 'getVendedObjects' fonctionne très bien! -S –