2009-11-19 23 views
1

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!

+0

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 –

Répondre

1

Je n'ai jamais vu quelqu'un tenter de vendre une vue ou une fenêtre sur un lien DO, et je suis surpris que cela fonctionne même sur l'hôte local. Chaque fois que j'ai utilisé DO, cela a été à partir d'objets dans la couche du contrôleur du serveur à un contrôleur correspondant dans le client.

+0

Ah, c'est probablement mon problème alors. Avoir l'objet dans le code et pas dans IB n'est pas un contrôleur? –

+0

Je suis complètement confus par ce commentaire. Vous devriez être en mesure de vendre n'importe quel objet à droite !? Je n'ai pas encore essayé mais je le ferai dans le futur. Merci – manifest

+1

Vous pouvez vendre une vue ou une fenêtre très bien. Le problème est qu'ils ne dessinent pas dans un objet passé à travers des objets distribués - ils dessinent dans un contexte graphique, et c'est toujours le contexte graphique du processus qui vend l'objet. (Cela peut même vous mordre avec NSImage - assurez-vous de passer ces 'bycopy'.) Ainsi, vous pouvez vendre une vue à travers DO, et vous pouvez même modifier ses attributs, mais vous ne pouvez pas dessiner dans une autre application. –