具有多个客户端的Obj-C服务器

时间:2009-12-10 07:24:29

标签: objective-c cocoa distributed-objects client-server

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

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

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

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

非常感谢任何帮助,如果有必要,我很乐意澄清任何事情。

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

这是一个快速的示例,用于跨过程进行通信,这是我第一次学习DO时回写的测试应用程序。设置完成后,您可以添加代码,使服务器根据您喜欢的任何事件向_clients数组中的一个或多个对象发送消息,包括为粗略的游戏循环设置计时器。 p>

服务器

- (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];
}

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

答案 1 :(得分:1)

  

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

这是我第一次像这样一起看过这些词;)