распределенный эрланг.Клиент не может увидеть зарегистрированный pid с сервера - PullRequest
0 голосов
/ 01 июня 2018

Я новичок в эрланге.Я не могу понять, почему моя программа не работает.Помогите мне, пожалуйста.

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).

Сервер регистрируется (атом, PID)

register( doServer, Pid = spawn(node(), ?MODULE, doServer,[[]])),

erlc smplMessenger.erl ;  echo " ****** RUN *******"; \
erl -noshell -sname p1 +v setcookie k1 -s smplMessenger server 

 ****** RUN *******
server 
server [code_server,erl_prim_loader,application_controller,kernel_safe_sup,
        standard_error_sup,inet_db,init,erts_code_purger,user,***doServer***,
        error_logger,rex,kernel_sup,erl_signal_server,global_name_server,
        standard_error,global_group,file_server_2] 
Start server 

В печати "зарегистрирован ()."Я вижу псевдоним " 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}]}]}

, строка 121 -

118: doClient(Name) ->
119:        io:format("[Client ~p ~p] Start client with serv pid ~p. Im alive ~n",
120:                        [self(), Name, whereis(doServer)]),
121:        doServer ! {isAlive, self(), Name},
121:
122:        clientRecv(Name),
123:
124:        io:format("[Client ~p ~p] FINISH CLIENT ~n",
125:                        [self(), Name]).

Я запускаю два узла с одного компьютера (Кук в двух узлах равен).

epmd, см. Процессы клиента и сервера.

Узел 1 и узел 2 могут пропинговать оба.

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 [] 

1 Ответ

0 голосов
/ 01 июня 2018

function registered() (на самом деле это erlang:registered/0 MFA. MFA обозначает Module, Function, Arity. /0 - это arity и означает, что принимает 0 аргументов), показывает зарегистрированные процессы и порты, которые зарегистрированы с использованием erlang:register/2.erlang:register/2 регистрирует имя для процесса или порта локально , затем работает для каждого узла и только для этого узла.Это означает, что узел p1 имеет свои собственные зарегистрированные процессы и не знает о зарегистрированных процессах других узлов.Также Узел p2 не знает о зарегистрированном процессе других узлов.
Я рекомендовал использовать модуль global для регистрации имени процесса в системе, состоящей из множестваУзлы Erlang.
Для приведенного выше примера вам нужны функции global:register_name/2 и global:registered_names/0.Также вы должны подключить второй запущенный узел к первому узлу перед этими операциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...