如何调用唯一注册的gen_server进程?

时间:2014-05-08 10:30:53

标签: erlang gen-server

我是Erlang的新手,我正在尝试构建一个简单的游戏服务器(学习目的)。

我有一个客户端控制器(主管),它创建了多个客户端处理程序(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 个答案:

答案 0 :(得分:-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函数。)