1

我有一个 erlang gen_fsm 进程,它使用 erlang 的内置 gen_tcp 通过 tcp 与远程服务器通信。

我想让它成为一个 web-socket 客户端。经过一番调查,我得到了这个 erlang websocket 客户端库Erlang Websocket client

看一些例子,看起来我必须使用

-行为(websocket_client_handler)。

基本上,我在 start_link 中执行此操作

start_link(UserID) ->
   gen_fsm:start_link(?MODULE, [UserID], []).

但是,另一种行为期望 init 有不同的返回值和不同的状态。我的 gen_fsm 已经有了一个状态。

有人可以为此提供一些背景信息。

我认为为同一个模块定义两种行为并没有错,但鉴于每种行为在 init/[1/2] 函数中需要不同的返回类型,我开始思考这是否真的可行。只是想联系有经验的人。

谢谢。

4

1 回答 1

1

原则上,我不认为这是一个问题:init/1并且init/2是两个完全不同的函数,gen_fsm:start_link只会调用init/1websocket_client:start_link只会调用init/2。当然,来自gen_fsm's 回调的状态不会传递给websocket_client's,所以它们可以完全不同。在实践中,我希望它真的很混乱。

相反,我会将 websocket 客户端分离到一个单独的模块中,该模块是从gen_fsm(如果我理解正确的话)调用的。

于 2017-06-24T20:57:02.443 回答