分布式erlang。客户端无法从服务器查看已注册的pid

分布式erlang。客户端无法从服务器查看已注册的pid,erlang,Erlang,我是二郎的新手。我不明白为什么我的程序不起作用。请帮帮我 server() -> io:format("server ~n"), register( doServer, Pid = spawn(node(), ?MODULE, doServer,[[]])), io:format("server ~p ~n", [registered()]). client() -> io:format("client ~p ~n",

我是二郎的新手。我不明白为什么我的程序不起作用。请帮帮我

server() ->
        io:format("server ~n"),
        register( doServer, Pid = spawn(node(), ?MODULE, doServer,[[]])),
        io:format("server ~p ~n", [registered()]).

client() ->
        io:format("client ~p ~n", [registered()]),
        spawn_clients(1).
服务器do寄存器(atom、PID)

在打印“registered()”中,我可以看到别名“doServer

但客户端无法看到别名“doServer”及其PID

erl -noshell setcookie k1 -sname p2  -s smplMessenger client 
Erlang/OTP 20 [erts-9.3] [source] [smp:2:2] [ds:2:2:10] [async-threads:10] [hipe] [kernel-poll:false]

client [code_server,erl_prim_loader,application_controller,erl_epmd,auth,
        standard_error_sup,net_kernel,inet_db,init,erts_code_purger,user,
        error_logger,rex,net_sup,kernel_sup,user_drv,kernel_safe_sup,
        erl_signal_server,global_name_server,standard_error,global_group,
        file_server_2] 
[Client <0.5.0>] node 1 spawned 
All client spawned
[Client <0.67.0> 1] Start client with serv pid undefined. Im alive 

=ERROR REPORT==== 31-May-2018::21:52:07 ===
Error in process <0.67.0> on node p2@station with exit value:
{badarg,[{smplMessenger,doClient,1,[{file,"smplMessenger.erl"},{line,121}]}]}
我从一台计算机上运行两个节点(两个节点中的Cooke相等)

epmd请参阅客户端和服务器进程

节点1和节点2可以ping这两个节点

netstat -tuwpln
Proto Recv-Q Send-Q Local Address Foreign Address State       PID/Program name
tcp        0      0 0.0.0.0:4369            0.0.0.0:*               LISTEN      1408/epmd
tcp        0      0 0.0.0.0:36499           0.0.0.0:*               LISTEN      3008/beam.smp
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:33865           0.0.0.0:*               LISTEN      3047/beam.smp
tcp6       0      0 :::4369                 :::*                    LISTEN      1408/epmd
tcp7       0      0 ::1:631                 :::*                    LISTEN      -
我哪里错了?帮帮我

我将注册更改为全局,但客户端进程无法看到服务器(doServer)任何内容

server() ->
        io:format("server ~n"),
        global:register_name( doServer, spawn(node(), ?MODULE, doServer,[[]])),
        io:format("server ~p ~n", [global:registered_names()]).


client() ->
        io:format("[Client ~p ] ~p ~n",
                        [self(), global:whereis_name(doServer)]),
        io:format("client ~p ~n", [global:registered_names()]).

erlc smplMessenger.erl ;  echo " ****** RUN *******"; erl -noshell -sname p1 -v -setcookie k1 -s smplMessenger server
 ****** RUN *******
server 
Start server 
server [doServer]

erlc smplMessenger.erl ;  echo " ****** RUN *******"; erl -noshell -sname p2 -v -setcookie k1 -s smplMessenger client

****** RUN *******
[Client <0.5.0> ] undefined 
client [] 
server()->
io:格式(“服务器~n”),
全局:register_name(doServer,spawn(node(),?MODULE,doServer,[[]]),
io:format(“server~p~n,[global:registered_names()])。
客户端()->
io:格式(“[Client~p]~p~n”,
[self(),全局:whereis_name(doServer)],
io:format(“client~p~n,[global:registered_names()])。
erlc smplMessenger.erl;回声“*******运行*******”;erl-noshell-sname p1-v-setcookie k1-s SMPMessenger服务器
******跑*******
服务器
启动服务器
服务器[doServer]
erlc smplMessenger.erl;回声“*******运行*******”;erl-noshell-sname p2-v-setcookie k1-s SMPMessenger客户端
******跑*******
[客户端]未定义
客户[]
函数
registered()
(实际上是
erlang:registered/0
MFA。MFA代表模块、函数、Arity。
/0
是Arity,表示它接受0个参数)显示使用
erlang:register/2
注册的已注册进程和端口
erlang:register/2
在本地注册进程或端口的名称,然后在每个节点上工作,并且仅在该节点上工作。这意味着节点
p1
有自己的注册进程,不知道其他节点的注册进程。另外,节点
p2
不知道其他节点的注册过程。
我建议在由许多Erlang节点组成的系统中使用模块为进程注册名称。

对于上面的示例,您需要函数
global:register_name/2
global:registed_name/0
。您还应该在这些操作之前将第二个启动的节点连接到第一个节点。

谢谢。您的意思是“您也应该在这些操作之前将第二个启动的节点连接到第一个节点。”?我将register改为global:register\u name,register改为global:registed\u name,whereis改为global:whereis\u name(doServer),但客户端进程看不到服务器(doServer)任何内容。您必须将节点连接在一起。例如,使用net_adm:ping/1。我建议您阅读全球代码
netstat -tuwpln
Proto Recv-Q Send-Q Local Address Foreign Address State       PID/Program name
tcp        0      0 0.0.0.0:4369            0.0.0.0:*               LISTEN      1408/epmd
tcp        0      0 0.0.0.0:36499           0.0.0.0:*               LISTEN      3008/beam.smp
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:33865           0.0.0.0:*               LISTEN      3047/beam.smp
tcp6       0      0 :::4369                 :::*                    LISTEN      1408/epmd
tcp7       0      0 ::1:631                 :::*                    LISTEN      -
server() ->
        io:format("server ~n"),
        global:register_name( doServer, spawn(node(), ?MODULE, doServer,[[]])),
        io:format("server ~p ~n", [global:registered_names()]).


client() ->
        io:format("[Client ~p ] ~p ~n",
                        [self(), global:whereis_name(doServer)]),
        io:format("client ~p ~n", [global:registered_names()]).

erlc smplMessenger.erl ;  echo " ****** RUN *******"; erl -noshell -sname p1 -v -setcookie k1 -s smplMessenger server
 ****** RUN *******
server 
Start server 
server [doServer]

erlc smplMessenger.erl ;  echo " ****** RUN *******"; erl -noshell -sname p2 -v -setcookie k1 -s smplMessenger client

****** RUN *******
[Client <0.5.0> ] undefined 
client []