2

私はかなり初心者の obj-c 開発者で、クライアントとサーバーの関係をセットアップする方法について質問があります。私は (主に趣味で) 友人や家族と一緒にインターネット上で遊べるボード ゲームをデザインしています (モノポリーと考えてください)。私の問題: 適切なクライアントとサーバーの関係をセットアップして、1 つのサーバーに複数のクライアントを配置するにはどうすればよいですか?

私が考えたのは、1 つのサーバーにゲームの状態に関するすべての情報を格納し、Cocoa の優れた分散オブジェクト フレームワークを通じてさまざまなオブジェクトに適切なメッセージを送信することでした。ただし、1 つのサーバーで複数のクライアントを受け入れる方法がわかりません。

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

しかし、その後は?クライアントが接続されているときに実行ループを停止するように指示する方法はありますか? 可能であればマルチスレッドは避けたいと思います。それは、学ぶのがまったく新しい複雑さであり、このプロジェクトはすでに十分に挑戦的です!

どんな助けでも大歓迎です。必要に応じて、何かを明確にしていただければ幸いです。

前もって感謝します。

4

2 に答える 2

2

基本的に取るべき戦略は、サーバー自体をルート オブジェクトとして登録することです。クライアントがサーバーに接続すると、クライアントはサーバーに接続メッセージ (作成したサーバーのプロトコルによって定義されます) を送信します。このメッセージにより、サーバーはそのクライアントに将来メッセージを送信するために登録することができます。これは、クライアントを配列に追加するのと同じくらい簡単です。特別な実行ループやスレッドは必要ありません。

DO を初めて学習したときに書き戻したテスト アプリから、プロセス間で通信するための簡単な例を次に示します。セットアップが完了したら、コードを追加して、_clients必要なイベントに基づいてサーバーが配列内の 1 つまたは複数のオブジェクトにメッセージを送信するようにします。これには、大まかなゲーム ループ用のタイマーのセットアップが含まれます。

サーバ:

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

分散オブジェクトには多くの「落とし穴」があることに注意してください。最初にゲームのアイデアの大まかなプロトタイプを作成する必要がある場合でも、簡単に始めてください。

于 2009-12-10T15:59:43.517 に答える
1

Cocoa の優れた分散オブジェクト フレームワーク

こんな言葉が並んでるの初めて見た(;_;)

于 2009-12-11T05:47:48.203 に答える