如何在Erlang OTP中将消息从一个节点发送到另一个节点

jogvjijk  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(262)

我们可以通过shell向现有进程发送一条消息,如下所示。我在这里通过用户名注册了一个进程(例如:Alice)代码:

start_link(Username) ->
  gen_server:start_link({local, Username}, ?MODULE, [Username], []).

stop(Username)->
  gen_server:stop(Username).

init([Username]) ->
  io:format("~p connected...",[Username]),
  {ok, #chat_server_state{
    username = Username
  }}.

过程开始如下:

chat_client:start_link(alice).
alice connected...{ok,<0.143.0>}

我发送消息你好处理爱丽丝和结果如下:

alice ! hello. %%sent 'hello' atom to 'alice' process
hello   %% result

我的问题是,如果我用相同的cookie启动两个节点,并用net_kernel连接这两个节点,为什么我仍然不能像上面的过程那样使用注册的进程名(而不是pid)从一个节点向另一个节点发送消息。
我的代码:这里我用节点名注册进程。

start_link(Username) ->
  gen_server:start_link({local, node()}, ?MODULE, [Username], []).

stop(Username)->
  gen_server:stop(Username).

init([Username]) ->
  io:format("~p connected...",[Username]),
  {ok, #chat_server_state{
    username = Username
  }}.

我在alice@...节点上启动了alice进程。

(alice@DESKTOP-RD414DV)79> chat_client:start_link(alice).
alice connected...{ok,<0.280.0>}

这是此alice进程使用其节点名称注册的位置

** Registered procs on node 'alice@DESKTOP-RD414DV' **
Name                  Pid          Initial Call                      Reds Msgs
'alice@DESKTOP-RD414D <0.250.0>    chat_client:init/1                  54    0

为什么我无法将消息从alice@.....节点发送到另一个节点(例如:鲍勃@台式机-RD 414 D**“鲍勃@台式机-RD 414 D”!您好。**)

(alice@DESKTOP-RD414DV)71> whereis('alice@DESKTOP-RD414DV').                
<0.250.0>

我得到这个错误:

(alice@DESKTOP-RD414DV)50> 'bob@DESKTOP-RD414DV' ! heelo.
** exception error: bad argument
     in operator  !/2
        called as 'bob@DESKTOP-RD414DV' ! heelo
niwlg2el

niwlg2el1#

要将消息发送到任何节点中的已注册流程,可以使用{Name :: atom(), Node :: node()} ! Message :: term()语法:

1> register(shell, self()).
true
2> shell ! test.
test
3> flush().
Shell got test
ok
4> {shell, node()} ! test.
test
5> flush().
Shell got test
ok

相关问题