2009-12-10 6 views
2

Je suis un développeur obj-c assez novice et j'ai une question sur la façon de mettre en place une relation client-serveur. Je conçois (principalement comme un hobby) un jeu de société à jouer sur Internet avec des amis et la famille (pensez monopole). Mon problème: comment configurer la relation client-serveur appropriée pour avoir un serveur avec plusieurs clients? Je pensais qu'un serveur devait contenir toutes les informations sur l'état du jeu et envoyer des messages appropriés à une variété d'objets grâce à l'excellent framework d'objets distribués de Cocoa. Cependant, je n'arrive pas à comprendre comment un serveur peut accepter plusieurs clients.Serveur Obj-C avec plusieurs clients

firstConnection = [NSConnection defaultConnection]; 
[firstConnection setRootObject: firstPlayer]; 
[[NSRunLoop currentRunLoop] run]; 

Mais alors quoi? Existe-t-il un moyen d'indiquer à la boucle d'exécution de s'arrêter lorsqu'un client est connecté? Je voudrais éviter de multiples threads si possible car ce serait une toute nouvelle complication à apprendre et ce projet est déjà assez ambitieux!

Toute aide serait grandement appréciée et je serais heureux de clarifier quoi que ce soit du tout si nécessaire.

Merci d'avance.

Répondre

2

Fondamentalement, la stratégie à adopter consiste à faire en sorte que le serveur s'enregistre lui-même en tant qu'objet racine. Lorsque le client se connecte au serveur, il envoie au serveur un message de connexion (défini par le protocole du serveur que vous créez) qui permet au serveur d'enregistrer ce client afin de lui envoyer des messages dans le futur. Cela pourrait être aussi simple que d'ajouter le client à un tableau; aucune boucle d'exécution spéciale ou threads ne devraient être nécessaires.

Voici un exemple rapide de communication entre processus, à partir d'une application de test que j'ai écrite lorsque j'apprenais DO pour la première fois. Une fois la configuration terminée, vous pouvez ajouter du code pour que le serveur envoie des messages à un ou plusieurs objets du tableau _clients en fonction de l'événement que vous souhaitez, y compris la configuration d'une minuterie pour une boucle de jeu approximative.

Serveur:

- (void)registerClient:(byref Client *)client; 
{ 
    [_clients addObject:client]; 
} 

- (void)awakeFromNib; 
{ 
    _clients = [[NSMutableArray alloc] init]; 

    [[NSConnection defaultConnection] setRootObject:self]; 

    if ([[NSConnection defaultConnection] registerName:@"server"] == NO) 
    { 
     // error code! 
    } 
} 

Client:

- (void)awakeFromNib; 
{  
    id theProxy; 
    theProxy = [[NSConnection rootProxyForConnectionWithRegisteredName:@"server" host:nil] retain]; 
    [theProxy setProtocolForProxy:@protocol(ServerP)]; 

    if (theProxy == nil) 
     // error code! 

    [theProxy registerClient:self]; 
} 

Gardez à l'esprit qu'il ya beaucoup de "trucs" dans les objets distribués! Commencez simple, même si cela signifie d'abord développer un prototype de votre idée de jeu.

+0

+1 pour le grand exemple Marc, une chose que je m n'est pas clair sur la ligne "[theProxy registerClient: self]". Comment le serveur peut-il appeler le client enregistré dans le futur puisque "self" est seulement un pointeur vers le client et non un proxy? L'objet "Client" est-il une sous-classe de NSDistantObject? – manifest

1

excellente Cocoa cadre d'objets distribués

C'est la première fois que je l'ai vu ces mots ensemble comme ça;)

+0

C'est plutôt excellent. – arbales

Questions connexes