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

Posted

技术标签:

【中文标题】具有多个客户端的 Obj-C 服务器【英文标题】:Obj-C server with multiple clients 【发布时间】:2009-12-10 07:24:29 【问题描述】:

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

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

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

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

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

提前致谢。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

+1 是一个很好的例子 Marc,我不清楚的一件事是“[theProxy registerClient:self]”这一行。由于“self”只是指向客户端而不是代理的指针,服务器将来如何调用已注册的客户端? “Client”对象是 NSDisantObject 的子类吗?【参考方案2】:

Cocoa 的优秀分布式对象框架

这是我第一次看到这样的单词;)

【讨论】:

以上是关于具有多个客户端的 Obj-C 服务器的主要内容,如果未能解决你的问题,请参考以下文章

c - 具有多个客户端的 UDP 客户端-服务器

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

是否有具有多个命名 Oidc 客户端的示例 quarkus 项目来调用多个服务调用?

具有多个客户端的 Windows Com Server 是不是是多线程连接的?

处理从具有相同 IP 的多个客户端中的服务器接收值

如何将实体框架用于具有多个客户端的应用程序