Trabalhando com mensagens em Erlang - PPCA2014/ppca_soa GitHub Wiki

% EXPLICAÇÃO DO MODULO AFILE_SERVER

% Referência: Programming Erlang Software for a Concurrent World por Joe Armstrong %p15-19

% modulo servidor, afile_server eh um atom para identificar o modulo

-module(afile_server).

-export([start/1, loop/1]).

% aqui comeca o cliente vai chamar afile:server:start(“c:\”) por exemplo % vai chamar spawn (cria processo) e executar loop % o loop recebe o Diretório que o cliente passou

start(Dir) -> spawn(afile_server, loop, [Dir]).

loop(Dir) ->

% aqui processa as mensagens

 receive
    {Client, list_dir} ->

    Client ! {self(), file:list_dir(Dir)};

{Client, {get_file, File}} ->

   Full = filename:join(Dir, File),

    Client ! {self(), file:read_file(Full)}

end,
loop(Dir).

%No prompt erl digita isso na sequencia para compilar e executar c(afile_server). l(afile_server). afile_server:start(".").

% Todo processo tem uma caixa de mensagem %o prompt erl também eh um processo %então tb tem uma caixa de mensagem quando declaramos uma variável

Servidor = afile_server:start(“c:”) %nos fizemos spawn dentro de start entao criamos um processo %e guardamos o PID (identificador de processo) na varivel

%agora temos dois processos %processo 1 -> o proprio prompt erl %processo 2 -> o Servidor que eh do tipo afile_server

%cada um tem uma caixa de mensagem

%quando enviamos mensagem com !

%um processo envia uma carta para outro processo

%Servidor ! { self(), list_dir}.

%estamos mandando uma mensagem para Servidor %depois do ! a mensagem

%e eh uma tupla %tuplas são { }

%o primeiro parâmetro da tupla quem manda mensagem %self() uma função que retorna o pid do processo atual

%esse self() eh do prompt do erl

%o segundo parâmetro eh um atom %list_dir

%quando o processo Servidor ler a mensagem no seu loop

%vai casar o padro { Cliente, list_dir}

%TODAS AS VARIÁVEIS SÓ MAIÚSCULA

%depois de processar a mensagem, o Servidor vai querer mandar resposta

%Cliente eh o pid de quem enviou a mensagem

%dai ele envia uma mensagem

%vai cair na caixa de mensagem do prompt erl %que como falei também eh um processo que ele vai processar

%nos usamos flush() para descarregar o buffer do prompt

%eh assim para todos os servidores

%ao enviar mensagem, geralmente o primeiro parâmetro self() %porque eh como se fosse uma carta na vida real %se vc não se identificar na carta, como oquem recebe a mensagem vai saber responder

%vai haver casos que no precisa retorno, dai nem precisa passar self() %Posso enviar qualquer coisa na mensagem aps o ! %não precisa ser tupla %Eliene ! ola %estou mandando uma mensagem do tipo atom ola para Eliene