2009-12-10 68 views
2

我是一个相当新手的obj-c开发人员,并且对如何建立客户端 - 服务器关系有疑问。我正在设计(主要是作为一种爱好)与朋友和家人在互联网上玩棋盘游戏(想想垄断)。我的问题:我如何设置适当的客户端 - 服务器关系以使一台服务器拥有多个客户端?具有多个客户端的Obj-C服务器

我的想法是让一台服务器包含有关游戏状态的所有信息,并通过Cocoa出色的分布式对象框架向各种对象发送适当的消息。但是,我无法弄清楚如何让一台服务器接受多个客户端。

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

但那又如何?有没有办法告诉运行循环在客户端连接时停止?如果可能的话,我想避免使用多线程,因为这将是一个全新的复杂的学习,这个项目已经足够具有挑战性了!

任何帮助将不胜感激,如果有必要,我很乐意澄清任何事情。

在此先感谢。

回答

2

基本上采取的策略是让服务器注册自己作为根对象。当客户端连接到服务器时,它会向服务器发送连接消息(由您创建的服务器协议定义),以允许服务器注册该客户端以便将来向其发送消息。这可能与将客户端添加到数组一样简单;不需要特殊的运行循环或线程。

下面是一个跨过程的简单示例,从我第一次学习DO时写回的测试应用程序开始。完成设置后,您可以添加代码,使服务器根据您希望的任何事件将消息发送到_clients阵列中的一个或多个对象,包括为粗略游戏循环设置计时器。

服务器:

- (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! 
    } 
} 

客户:

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

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

    [theProxy registerClient:self]; 
} 

请记住,有分布式对象很多 “陷阱” 的!从简单开始,即使它意味着首先开发一个游戏理念的粗略原型。

+0

+1的很好的例子 马克,有一件事我m不清楚的是“[theProxy registerClient:self]”。由于“self”只是指向客户端而不是代理的指针,因此服务器将来如何在注册的客户端上调用? “客户”对象是NSDistantObject的子类吗? – manifest 2010-04-09 18:15:27

1

可可的优秀分布式对象框架

这是我见过的那些话在一起,就像是第一次;)

+0

非常好。 – arbales 2010-05-30 20:00:32

相关问题