连接到另一个节点上生成的进程

use*_*428 2 erlang distributed distributed-computing

假设我有一个名为"server"的节点,它会生成一个名为"server1"的进程,如下所示:

register(server1,spawn(module, generate_new_server, []))
Run Code Online (Sandbox Code Playgroud)

如何从名为"user"的其他节点向"server1"发送消息?

使用net_adm我只能ping节点"server",而不能生成节点"server1".我想我启动服务器的方式有问题,即

erl -sname server
Run Code Online (Sandbox Code Playgroud)

现在,如果我在另一台机器上

erl -sname user
net_adm:ping('server@pc')
Run Code Online (Sandbox Code Playgroud)

从"user @ pc"我可以连接到它,但如果我这样做

erl -sname user
net_adm:ping('server1@pc')
Run Code Online (Sandbox Code Playgroud)

它告诉我无法到达节点.是否有不同的语法用于连接"server1"?

小智 6

net_adm:ping用于ping远程erlang节点,而不是在该节点上运行的进程.为了将消息发送到远程进程,您可以在全局而不是本地注册它:

在服务器节点上:

 global:register_name(server1,spawn(fun() -> receive X -> io:format("Received ~p~n", [X]) end end)).
Run Code Online (Sandbox Code Playgroud)

然后在用户节点上:

global:send(server1, test).
Run Code Online (Sandbox Code Playgroud)

服务器节点上的输出:

Received test
Run Code Online (Sandbox Code Playgroud)