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

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

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

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

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

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

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

提前致谢。

最佳答案

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

这是一个跨进程通信的快速示例,来 self 第一次学习 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];
}

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

关于objective-c - 具有多个客户端的 Obj-C 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1879208/

相关文章:

ios - 我可以将 retain 与 ARC 一起使用吗?

cocoa - 使 NSConnection 停止,直到找到注册名称的连接

objective-c - 分布式对象崩溃

cocoa - 在 Cocoa 中如何从这个可变数组更新 NSTableView ?

objective-c - 在 10.9 上以编程方式启用对辅助设备的访问

objective-c - 分布式对象、线程、Objective-C

ios - UIButton 框架根据设备语言而变化

ios - 当我更改 UILabel 的文本时屏幕不会更新

ios - 使用 pangesture 在父 View 中移动 UIView

objective-c - 计算返回 0 Objective-c