2014-05-08 70 views
0

我是Erlang的新手,我正在嘗試構建一個簡單的遊戲服務器(學習目的)。如何調用唯一註冊的gen_server進程?

我有一個客戶端控制器(超級用戶)創建多個客戶端處理程序(gen_server)。我還有一個遊戲控制器(主管)創建了多個遊戲處理程序(gen_server)。

一個遊戲處理程序(遊戲桌)然後將與幾個客戶端處理程序(玩家)進行通信。我創建這樣的客戶端處理程序:

client_handler.erl:

start_link(ClientId, UniqueId) -> 
    ClientHandlerId = utils:create_id(?MODULE, UniqueId), //client_handler_0 

    State = #state{client_id = ClientId, client_handler_id = ClientHandlerId}, 

    gen_server:start_link({global, ClientHandlerId}, ?MODULE, State, []). 

game_handler.erl:

start_link(ClientHandlerId, GameId, UniqueId) ->  

    GameHandlerId = utils:create_id(?MODULE, UniqueId), //game_handler_0 

    State = #state{client_handler_id = ClientHandlerId, game_id = GameId, game_handler_id = GameHandlerId}, 

    gen_server:start_link({global, GameHandlerId}, ?MODULE, State, []). 

我的問題是,我想的Client_Handler和game_handler之間不說話他們都不瞭解他們的內部結構。現在我用:

client_handler.erl:

gen_server:cast(game_handler_0, {make_move, MoveData}). 

來完成這項工程。不過,我想用:

client_handler.erl:

game_handler_0:make_move(MoveData) 

所以我可以建立單獨的API:■每個模塊(只使用-export函數)。這可能嗎?

最好的問候, xqtr

編輯:錯字

回答

-1

是的,它被認爲是很好的做法,以這種方式抽象出來,實現細節。只要移動電話cast到一個函數在game_handler.erl,是這樣的:

make_move(UniqueId, MoveData) -> 
    GameHandlerId = utils:create_id(?MODULE, UniqueId), 
    gen_server:cast(GameHandlerId, {make_move, MoveData}). 

和出口make_move/2。 (或者可能忘記了UniqueId,並將GameHandlerId直接傳遞給make_move函數。)

+0

您好@legoscia,感謝您的回覆!將會有獨特的客戶端處理程序和獨特的遊戲處理程序。客戶端控制器將創建一個唯一的客戶端處理程序,如'client_handler_5'。這個註冊的原子將被傳遞給遊戲控制器,遊戲控制器將創建一個獨特的遊戲處理程序,比如'game_handler_22'。我可以通過在client_handler中創建一個函數來連接客戶端處理程序,如connect(GameHandlerId),然後在遊戲處理程序中使用: client_handler_5:connect(game_handler_22)? 是否必須全局註冊gen_server中的名稱:start_link? – xqtr

相關問題