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