2009-12-10 67 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

相關問題