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