5. Comunicacao entre Processos

29
Unidade 5 Unidade 5 Comunica Comunicaç ão ão entre Processos entre Processos Pipes Pipes Sockets Sockets Java RMI Java RMI 2 Comunica Comunicaç ão entre Processos ão entre Processos Processos e Processos e threads threads interagem para interagem para trabalhar conjuntamente em um sistema trabalhar conjuntamente em um sistema Trocam dados / mensagens Trocam dados / mensagens Utilizam os servi Utilizam os serviços de comunica os de comunicaç ão fornecidos ão fornecidos pela m pela máquina e pelo S.O. quina e pelo S.O. Seguem protocolos de comunica Seguem protocolos de comunicaç ão para que ão para que possam entender uns aos outros possam entender uns aos outros

Transcript of 5. Comunicacao entre Processos

Page 1: 5. Comunicacao entre Processos

Unidade 5Unidade 5

ComunicaComunicaçção ão entre Processosentre Processos

�� PipesPipes�� SocketsSockets�� Java RMIJava RMI

2

ComunicaComunicaçção entre Processosão entre Processos

�� Processos e Processos e threadsthreads interagem para interagem para trabalhar conjuntamente em um sistema trabalhar conjuntamente em um sistema �� Trocam dados / mensagensTrocam dados / mensagens�� Utilizam os serviUtilizam os serviçços de comunicaos de comunicaçção fornecidos ão fornecidos pela mpela mááquina e pelo S.O.quina e pelo S.O.

�� Seguem protocolos de comunicaSeguem protocolos de comunicaçção para que ão para que possam entender uns aos outrospossam entender uns aos outros

Page 2: 5. Comunicacao entre Processos

3

ComunicaComunicaçção entre Processosão entre Processos

�� ProtocolosProtocolos�� EstabelecemEstabelecem caminhoscaminhos virtuaisvirtuais de de comunicacomunicaççãoão entreentre processosprocessos / threads/ threads

�� DuasDuas entidadesentidades precisamprecisam usarusar osos mesmosmesmosprotocolosprotocolos parapara trocartrocar informainformaççõesões

Protocolo

Meio de Transmissão

4

ComunicaComunicaçção entre Processosão entre Processos

�� ProtocolosProtocolosPede conexão

tempo

Aceita conexão

Confirma recepção

Fecha conexão

Libera conexão

Envia mensagem

Com licença…

Pois não…

São 8 horas.

Obrigado!

De nada.

Que horas são?

Page 3: 5. Comunicacao entre Processos

5

�� Canal de Comunicação

ComunicaComunicaçção entre Processosão entre Processos

�� ServiServiççosos de de comunicacomunicaççãoão�� ServiServiççoo semsem ConexãoConexão: : cadacada unidadeunidade de dados de dados éé enviadaenviada independentementeindependentemente dasdas demaisdemais

�� ServiServiççoo com com ConexãoConexão: dados : dados sãosão enviadosenviadosatravatravééss de um canal de de um canal de comunicacomunicaççãoão

��

��

6

ComunicaComunicaçção entre Processosão entre Processos

�� CaracterCaracteríísticas dos servisticas dos serviçços de os de comunicacomunicaçção entre processos/ão entre processos/threadsthreads::�� Abrangência: local ou remotaAbrangência: local ou remota�� Participantes: 1 Participantes: 1 �� 1, 1 1, 1 �� N ou M N ou M �� NN�� Tamanho das mensagens: fixo ou variTamanho das mensagens: fixo ou variáável; vel; limitado ou nãolimitado ou não

�� Sincronismo: comunicaSincronismo: comunicaçção são sííncrona, ncrona, assassííncrona ou semincrona ou semi--ssííncronancrona

Page 4: 5. Comunicacao entre Processos

7

ComunicaComunicaçção entre Processosão entre Processos

�� APIs de APIs de comunicacomunicaççãoão�� PermitemPermitem queque aplicaaplicaççõesões troquemtroquem dadosdados�� FornecemFornecem primitivasprimitivas de de comunicacomunicaççãoão quequepodempodem ser ser chamadaschamadas a a partirpartir do do ccóódigodigo

�� ProvêemProvêem acessoacesso aosaos serviserviççosos de de comunicacomunicaççãoão, , queque podempodem assimassim ser ser usadosusados pelaspelas aplicaaplicaççõesões

Programa

APIAPI

S.O.S.O.

8

ComunicaComunicaçção entre Processosão entre Processos

�� APIsAPIs de Comunicade Comunicaçção de ão de SistSist. Operacionais. Operacionais�� Mecanismos fornecidos Mecanismos fornecidos pelos S.O.pelos S.O.’’s permitem s permitem enviar mensagens enviar mensagens (trechos de mem(trechos de memóória) ria) de um processo a outrode um processo a outro

�� Alguns S.O.Alguns S.O.’’s permitem s permitem que sejam criadas que sejam criadas ááreas de memreas de memóória ria compartilhadas entre compartilhadas entre dois ou mais processosdois ou mais processos

memóriaPP11 PP22

PP11 PP22

8

Page 5: 5. Comunicacao entre Processos

9

ComunicaComunicaçção entre Processosão entre Processos

�� ExemplosExemplos de APIs de de APIs de comunicacomunicaççãoão::�� Pipes: Pipes: canaiscanais de de comunicacomunicaççãoão locaislocais�� Sockets: Sockets: portasportas de de comunicacomunicaççãoão locaislocais ouou de de rederede ((versãoversão segurasegura: SSL): SSL)

�� SuportesSuportes de RPC (de RPC (Remote Procedure CallRemote Procedure Call): ): permitempermitem chamarchamar procedimentos/mprocedimentos/méétodostodosremotamenteremotamente (ex.: RMI, CORBA, COM, (ex.: RMI, CORBA, COM, ……))

�� CanaisCanais de de eventoseventos: : permitempermitem notificarnotificar threads threads e e processosprocessos dos dos eventoseventos ocorridosocorridos no no sistemasistema(Ex.: JMS, CORBA Notification Service, (Ex.: JMS, CORBA Notification Service, ……))

�� ……

10

ComunicaComunicaçção entre Processosão entre Processos

�� Mecanismos de IPC nativos do UNIXMecanismos de IPC nativos do UNIX�� PipesPipes�� SocketsSockets (comunica(comunicaçção local ou remota)ão local ou remota)

�� Mecanismos de IPC nativos do WindowsMecanismos de IPC nativos do Windows�� PipesPipes e e MailslotsMailslots�� WinSockWinSock (comunica(comunicaçção local ou remota)ão local ou remota)�� Microsoft RPC (comunicaMicrosoft RPC (comunicaçção local ou remota)ão local ou remota)�� MemMemóória compartilhada:ria compartilhada: File File MappingMapping e e DynamicDynamic Data ExchangeData Exchange (DDE)(DDE)

�� ObjectObject LinkingLinking andand EmbeddingEmbedding (OLE)(OLE)10

Page 6: 5. Comunicacao entre Processos

11

ComunicaComunicaçção entre Processosão entre Processos

�� RPC RPC –– Chamada Remota de ProcedimentoChamada Remota de Procedimento�� Segue o modelo Cliente/Servidor Segue o modelo Cliente/Servidor �� Muito usado na interaMuito usado na interaçção entre objetosão entre objetos�� Objeto servidor possui interface com mObjeto servidor possui interface com méétodos todos que podem ser chamados remotamenteque podem ser chamados remotamente

�� Objetos clientes usam serviObjetos clientes usam serviçços de servidoresos de servidores

…x = Servidor.Soma(y,z);…

Cliente

����

Soma(int y, int z) {return(y+z);}

Servidor

����

12

ComunicaComunicaçção entre Processosão entre Processos

�� RPC RPC –– CaracterCaracteríísticassticas�� EmEm geralgeral as as requisirequisiççõesões sãosão pontoponto--aa--pontoponto e e ssííncronasncronas

�� Dados Dados sãosão tipadostipados��Parâmetros da requisiParâmetros da requisiççãoão��Retorno do procedimento/mRetorno do procedimento/méétodotodo��ExceExceççõesões

�� Um objeto pode ser cliente e servidor em Um objeto pode ser cliente e servidor em momentos diferentesmomentos diferentes

Page 7: 5. Comunicacao entre Processos

13

ComunicaComunicaçção entre Processosão entre Processos

�� NotificaNotificaççãoão de Eventosde Eventos�� Eventos ocorridos são difundidos por Eventos ocorridos são difundidos por produtores e entregues a consumidoresprodutores e entregues a consumidores

�� Canal de eventos permite o Canal de eventos permite o ddesacoplamentoesacoplamento ––produtor e consumidor não precisam se conhecerprodutor e consumidor não precisam se conhecer

Canal de Eventos

Consumidores de Eventos

Produtores de Eventos

14

ComunicaComunicaçção entre Processosão entre Processos

�� NotificaNotificaççãoão de de EventosEventos –– CaracterCaracteríísticassticas�� EnvioEnvio de de eventoseventos éé completamentecompletamente assassííncrononcrono

��ProdutorProdutor nãonão precisaprecisa aguardaraguardar fimfim do do envioenvio��EventoEvento éé armazenadoarmazenado no canal de no canal de eventoseventos

�� ComunicaComunicaççãoão podepode ser ser feitafeita atravatravééss de UDP de UDP multicastmulticast ouou fazendofazendo mmúúltiplosltiplos enviosenvios unicastunicastcom TCP, UDP com TCP, UDP ouou com um com um suportesuporte de RPCde RPC

�� Os Os eventoseventos podempodem terter tamanhotamanho fixofixo ououvarivariáávelvel, , limitadolimitado ouou ilimitadoilimitado

�� EventosEventos podempodem ser ser tipadostipados ouou nãonão

Page 8: 5. Comunicacao entre Processos

15

Thread 2Thread 1

PipesPipes

�� PipesPipes = canais de comunica= canais de comunicaçção ão �� Duas Duas threadsthreads podem trocar dados por um podem trocar dados por um pipepipe�� comunicacomunicaçção de 1 para 1ão de 1 para 1

�� ThreadsThreads devem rodar na mesma mdevem rodar na mesma mááquina quina virtual virtual �� comunicacomunicaçção localão local

�� PIPE ��

16

PipesPipes

�� DisponDisponííveis em Java atravveis em Java atravéés das classes s das classes PipedInputStreamPipedInputStream e e PipedOutputStreamPipedOutputStream

�� Principais mPrincipais méétodos:todos:�� CriaCriaçção dos ão dos PipesPipes::

is = new is = new PipedInputStreamPipedInputStream();();os = new os = new PipedOutputStreamPipedOutputStream(is);(is);

�� Envio e recepEnvio e recepçção de bytes / ão de bytes / arraysarrays de bytes:de bytes:is.is.readread(dado)(dado)os.os.writewrite(dado); os.flush();(dado); os.flush();

�� ExceExceçção: ão: javajava..ioio..IOExceptionIOException

Page 9: 5. Comunicacao entre Processos

17

PipesPipes

�� Uso de Uso de PipesPipes com fluxos (com fluxos (streamsstreams) de dados) de dados�� CriaCriaçção do fluxo:ão do fluxo:

in = new in = new javajava..ioio..DataInputStreamDataInputStream(is);(is);outout = new = new javajava..ioio..DataOutputStreamDataOutputStream(os);(os);

�� Envio e recepEnvio e recepçção de dados:ão de dados:<<tipotipo> var = in.> var = in.readread<<tipotipo>();>();out.out.writewrite<<tipotipo>(var);>(var);onde onde <<tipotipo>> = Int, = Int, LongLong, , FloatFloat, , DoubleDouble, etc., etc.

18

PipesPipes

public class Producer extends Thread {private DataOutputStream out;private Random rand = new Random();public Producer(PipedOutputStream os) {

out = new DataOutputStream(os); }public void run() {while (true)

try {int num = rand.nextInt(1000);out.writeInt(num);out.flush();sleep(rand.nextInt(1000));

} catch(Exception e) { e.printStackTrace(); }}

}

Page 10: 5. Comunicacao entre Processos

19

PipesPipes

public class Consumer extends Thread {private DataInputStream in;public Consumer(PipedInputStream is) {

in = new DataInputStream(is); }public void run() {

while(true) try {

int num = in.readInt();System.out.println("Número recebido: " + num);

} catch(IOException e) { e.printStackTrace(); }}

}

20

PipesPipes

public class PipeTest {public static void main(String args[]) {try {PipedOutputStream out = new PipedOutputStream();PipedInputStream in = new PipedInputStream(out);

Producer prod = new Producer(out);Consumer cons = new Consumer(in);

prod.start();cons.start();

} catch (IOException e) { e.printStackTrace(); }}

}

Page 11: 5. Comunicacao entre Processos

21

PipesPipes

�� Uso de Uso de PipesPipes com fluxos de objetoscom fluxos de objetos�� CriaCriaçção do fluxo:ão do fluxo:

in = new in = new javajava..ioio..ObjectInputStreamObjectInputStream(is);(is);outout = new = new javajava..ioio..ObjectOutputStreamObjectOutputStream(os);(os);

�� Envio e recepEnvio e recepçção de objetos:ão de objetos:<<classeclasse> obj = (<> obj = (<classeclasse>) in.>) in.readObjectreadObject();();out.out.writeObjectwriteObject(obj);(obj);onde onde <<classeclasse>> = classe do objeto lido/enviado= classe do objeto lido/enviado

�� Envio e recepEnvio e recepçção de ão de StringsStrings::String String strstr = in.= in.readUTFreadUTF();();out.out.writeUTFwriteUTF((strstr););

22

SocketsSockets

�� SocketSocket�� AbstraAbstraççãoão queque representarepresenta umauma portaporta de de comucomu--nicanicaççãoão bidirecionalbidirecional associadaassociada a um a um processoprocesso

�� PrincipaisPrincipais TiposTipos de Socketde Socket�� Socket Socket DatagramaDatagrama: : envia/recebeenvia/recebe datagramasdatagramassemsem criarcriar conexãoconexão; ; usausa protocoloprotocolo UDPUDP

�� Socket Multicast: Socket Multicast: receberecebe as as mensagensmensagensendereendereççadasadas a um a um grupogrupo; ; usausa UDP multicastUDP multicast

�� Socket Stream: Socket Stream: estabeleceestabelece umauma conexãoconexão com com outrooutro socket; socket; usausa protocoloprotocolo TCPTCP

Page 12: 5. Comunicacao entre Processos

23

SocketsSockets

�� OperaOperaççõesões com com SocketsSockets DatagramaDatagrama�� CriarCriar um socket um socket datagramadatagrama: :

DatagramSocketDatagramSocket s = new s = new DatagramSocket(portaDatagramSocket(porta););

�� CriarCriar pacotespacotes de dados de dados parapara envioenvio::DatagramPacketDatagramPacket pack = new pack = new DatagramPacket(msgDatagramPacket(msg, , tamanhotamanho, , destinodestino, , portaporta););

�� EnviarEnviar dados: dados: s.send(packs.send(pack););

�� CriarCriar pacotespacotes de dados de dados parapara receprecepççãoão::DatagramPacketDatagramPacket pack = new pack = new DatagramPacket(msg,tamDatagramPacket(msg,tam); );

�� ReceberReceber dados: dados: s.receive(packs.receive(pack););

�� LerLer dados do dados do pacotepacote:: pack.getDatapack.getData()()

24

SocketsSockets

�� SocketsSockets DatagramaDatagrama –– EnvioEnviotry {

DatagramSocket socket = new DatagramSocket();InetAddress destino = InetAddress.getByName(

"127.0.0.1");String mensagem = "Hello";byte[] dados = mensagem.getBytes();int porta = 1234;DatagramPacket pacote = new DatagramPacket(

dados, dados.length, destino, porta);socket.send(pacote);

} catch (SocketException e) { e.printStackTrace();} catch (IOException e) {e.printStackTrace(); }

Page 13: 5. Comunicacao entre Processos

25

SocketsSockets

�� SocketsSockets DatagramaDatagrama –– RecepRecepççãoãotry {

int porta = 1234;DatagramSocket socket = new DatagramSocket(porta);byte[] dados = new byte[100];DatagramPacket pacote = new DatagramPacket(

dados, dados.length);socket.receive(pacote);String mensagem = new String(pacote.getData(), 0,

pacote.getLength() );System.out.println("Mensagem: " + mensagem);

} catch (SocketException e) { e.printStackTrace();} catch (IOException e) {e.printStackTrace(); }

26

SocketsSockets

�� SocketsSockets MulticastMulticast�� PermitemPermitem o o envioenvio simultâneosimultâneo de de datagramasdatagramas a a gruposgrupos de de destinatdestinatááriosrios

�� GruposGrupos multicast multicast sãosão identificadosidentificados porporendereendereççosos IP de 224.0.0.0 a 239.255.255.255IP de 224.0.0.0 a 239.255.255.255

Grupo Multicast

Emissores

Page 14: 5. Comunicacao entre Processos

27

SocketsSockets

�� SocketsSockets MulticastMulticast�� VVááriosrios emissoresemissores podempodem mandarmandar mensagensmensagensparapara o o grupogrupo ((ouou sejaseja, , mensagensmensagens vãovão de de X X emissoresemissores →→ Y Y receptoresreceptores))

�� EmissorEmissor nãonão precisaprecisa fazerfazer parteparte do do grupogrupo paraparaenviarenviar mensagensmensagens aoao grupogrupo, e , e nemnem precisaprecisasaber saber quemquem sãosão osos seusseus membrosmembros; ; bastabastaconhecerconhecer o o endereendereççoo IP do IP do grupogrupo

�� O receptor entra em um grupo (se torna um O receptor entra em um grupo (se torna um membro do grupo) e passa a receber as membro do grupo) e passa a receber as mensagens destinadas ao grupomensagens destinadas ao grupo

28

SocketsSockets

�� SocketsSockets MulticastMulticast –– Envio Envio try {

DatagramSocket socket = new DatagramSocket();InetAddress grupo = InetAddress.getByName(

"230.1.2.3");String mensagem = "Hello";byte[] dados = mensagem.getBytes();int porta = 1234;DatagramPacket pacote = new DatagramPacket(

dados, dados.length, grupo, porta);socket.send(pacote);

} catch (SocketException e) { e.printStackTrace();} catch (IOException e) { e.printStackTrace(); }

Page 15: 5. Comunicacao entre Processos

29

SocketsSockets

�� SocketsSockets MulticastMulticast –– RecepRecepççãoãotry {

int porta = 1234;MulticastSocket msocket = new MulticastSocket(porta);InetAddress grupo = InetAddress.getByName(

"230.1.2.3");msocket.joinGroup(grupo);byte[] dados = new byte[100];DatagramPacket pacote = new DatagramPacket(

dados, dados.length);msocket.receive(pacote);System.out.println("Mensagem: " +

new String(pacote.getData(), 0, pacote.getLength()));} catch (Exception e) {e.printStackTrace(); }

30

SocketsSockets

�� Sockets StreamSockets Stream�� EstabelecemEstabelecem canaiscanais de de comunicacomunicaççãoão entreentreaplicaaplicaççõesões, , permitindopermitindo trocatroca de dados de dados pelapela rederede

�� AdotamAdotam o o paradigmaparadigma clientecliente--servidorservidor��ClienteCliente: : pedepede parapara conectarconectar aoao servidorservidor��ServidorServidor: : aguardaaguarda conexõesconexões dos dos clientesclientes

Cliente����

Servidor����

Page 16: 5. Comunicacao entre Processos

31

SocketsSockets

�� OperaOperaççõesões com com SocketsSockets StreamStream no Servidorno Servidor�� CriarCriar um socket um socket servidorservidor: :

ServerSocketServerSocket s = new s = new ServerSocket(portaServerSocket(porta, , maxClientesmaxClientes););

�� AguardarAguardar conexãoconexão: : Socket c = Socket c = s.accepts.accept();();

�� ObterObter nomenome do host do host conectadoconectado::String host = String host = c.getInetAddress().getHostNamec.getInetAddress().getHostName();();

�� CriarCriar fluxosfluxos de de comunicacomunicaççãoão: : ObjectInputStreamObjectInputStream in = new in = new

ObjectInputStream(c.getInputStreamObjectInputStream(c.getInputStream());());ObjectOutputStreamObjectOutputStream out = new out = new

ObjectOutputStream(c.getOutputStreamObjectOutputStream(c.getOutputStream());());

�� FecharFechar conexãoconexão: : in.closein.close(); (); out.closeout.close(); (); c.closec.close();();

32

�� OperaOperaççõesões com com SocketsSockets StreamStream no Clienteno Cliente�� CriarCriar um socket um socket clientecliente: :

Socket c =Socket c = new Socket( new Socket( InetAddressInetAddress..getByName("getByName("servidor.comservidor.com "), "), portaporta ););

�� CriarCriar fluxofluxo, , enviarenviar e e receberreceber dados, e dados, e fecharfechar: : idem idem aoao servidorservidor

�� ExceExceççõesões geradasgeradas�� SocketExceptionSocketException�� UnknownHostExceptionUnknownHostException�� IOExceptionIOException

SocketsSockets

Page 17: 5. Comunicacao entre Processos

33

SocketsSockets

�� SocketsSockets StreamStream –– ServidorServidortry {

ServerSocket s = new ServerSocket(1234, 10);Socket c = s.accept();ObjectOutputStream output = new ObjectOutputStream(

c.getOutputStream());output.flush();ObjectInputStream input = new ObjectInputStream(

c.getInputStream() );String mensagem = (String) input.readObject();String resposta = "Olá Cliente";output.writeObject(resposta); output.flush();

} catch (Exception e) { e.printStackTrace(); }

34

SocketsSockets

�� SocketsSockets StreamStream –– ClienteClientetry {

Socket socket = new Socket(InetAddress.getByName( "127.0.0.1"), 1234);

ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());

output.flush();ObjectInputStream input = new ObjectInputStream(

socket.getInputStream() );String mensagem = "Olá Servidor";output.writeObject(mensagem); output.flush();String resposta = (String) input.readObject();

} catch (Exception e) { e.printStackTrace(); }

Page 18: 5. Comunicacao entre Processos

35

JVMJVM

Java RMIJava RMI

�� Java RMIJava RMI ((RemoteRemote MethodMethod InvocationInvocation))�� ForneceFornece um suporte um suporte simples simples para RPC/RMIpara RPC/RMI�� Permite que um objeto Permite que um objeto JavaJava chame mchame méétodos todos de de outrooutro objetoobjeto Java Java rodandorodando em outra em outra JVMJVM

�� SoluSoluçção especão especíífica para a plataforma Java fica para a plataforma Java

InternetInternetClienteCliente ServidorServidor

36

JVMJVM

Java RMIJava RMI

�� Arquitetura RMIArquitetura RMI�� StubStub e e SkeletonSkeleton�� CamadaCamada de de referênciareferência remotaremota�� CamadaCamada de de transportetransporte

Camada de Transporte

Camada de Referência Remota

SkeletonStub

Cliente Servidor

Page 19: 5. Comunicacao entre Processos

37

Java RMIJava RMI

�� SStubtub�� RepresentaRepresenta o o servidorservidor parapara o o clientecliente�� EfetuaEfetua serializaserializaççãoão e e envioenvio dos dos parâmetrosparâmetros�� RecebeRecebe a a respostaresposta do do servidorservidor, , desserializadesserializa e e entregaentrega aoao clientecliente

�� SSkeletonkeleton�� RecebeRecebe a a chamadachamada e e desserializadesserializa ososparâmetrosparâmetros enviadosenviados pelopelo clientecliente

�� FazFaz a a chamadachamada no no servidorservidor e e retornaretorna o o resultadoresultado aoao clientecliente

38

Java RMIJava RMI

�� CCamada de Referência Remotaamada de Referência Remota�� RResponsesponsáávelvel pelapela localizalocalizaççãoão dos dos objetosobjetos nasnasmmááquinasquinas dada rederede

�� PermitePermite queque referênciasreferências parapara um um objetoobjetoservidorservidor remotoremoto sejamsejam usadasusadas pelospelos clientesclientesparapara chamarchamar mméétodostodos

�� CCamada de Transporteamada de Transporte�� CriaCria e e gerenciagerencia conexõesconexões de de rederede entreentreobjetosobjetos remotosremotos

�� Elimina a necessidade do cElimina a necessidade do cóódigo do cliente ou digo do cliente ou do servidor interagirem com o suporte de rededo servidor interagirem com o suporte de rede

Page 20: 5. Comunicacao entre Processos

39

Java RMIJava RMI

�� DinâmicaDinâmica dada ChamadaChamada RMIRMI�� O O servidorservidor, , aoao iniciariniciar, se , se registraregistra no no serviserviççoo de de nomesnomes (RMI (RMI Registry Registry ))

�� O O clientecliente obtobtéémm umauma referênciareferência parapara o o objetoobjetoservidorservidor no no serviserviççoo de de nomesnomes e e criacria a a stubstub

�� O O clientecliente chamachama o o mméétodotodo nana stubstub fazendofazendoumauma chamadachamada locallocal

�� A A stubstub serializaserializa osos parâmetrosparâmetros e e transmitetransmite a a chamadachamada pelapela rederede parapara o o skeletonskeleton do do servidorservidor

40

Java RMIJava RMI

�� DinâmicaDinâmica dada ChamadaChamada RMI (cont.)RMI (cont.)�� O O skeletonskeleton do do servidorservidor receberecebe a a chamadachamada pelapelarederede, , desserializadesserializa osos parâmetrosparâmetros e e fazfaz a a chamadachamada do do mméétodotodo no no objetoobjeto servidorservidor

�� O O objetoobjeto servidorservidor executaexecuta o o mméétodotodo e e retornaretornaum valor um valor parapara o o skeletonskeleton, , queque o o serializaserializa e o e o enviaenvia pelapela rederede àà stub stub do do clientecliente

�� A A stubstub receberecebe o valor do o valor do retornoretorno serializadoserializado, o , o desserializadesserializa e e porpor fimfim o o repassarepassa aoao clientecliente

Page 21: 5. Comunicacao entre Processos

41

Java RMIJava RMI

�� SerializaSerializaççãoão de Dadosde Dados�� ÉÉ preciso preciso serializarserializar e e deserializardeserializar os os parâmetrosparâmetros dada chamadachamada e valores de retorno e valores de retorno para transmitipara transmiti--los atravlos atravéés da redes da rede

�� Utiliza o sistema de Utiliza o sistema de serializaserializaççãoão de objetos da de objetos da mmááquina virtualquina virtual��TiposTipos predefinidospredefinidos dada linguagemlinguagem��ObjetosObjetos serializserializááveisveis: : implementamimplementaminterface interface java.io.serializablejava.io.serializable

42

Implementação de RMI�� VVááriosrios objetos estão envolvidos com o objetos estão envolvidos com o suporte a RMI.suporte a RMI.

Módulo referência remota

Objeto ACliente

Stub B

Módulo comunicação

Módulo comunicação

Objeto remoto BServidor

Reply

Módulo referência remota

Skeleton & Dispatcher da

Classe B

Request

Page 22: 5. Comunicacao entre Processos

43

� Receita de bolo:� Definir uma interface remota que descreve como o

cliente e o servidor se comunicam um com o outro;� Definir o aplicativo servidor que implementa a

interface remota. Por convenção, a classe de implementação de servidor tem o mesmo nome que a interface remota e termina com Impl;

� Definir o aplicativo cliente que utiliza uma referência de interface remota para interagir com a implementação de servidor da interface. Isto é, um objeto da classe que implementa a interface remota;

� Compilar e executar o servidor e o cliente.

Exemplo: Cliente/Servidor RMI

44

Servidor.java

rmic

Escreve servidor

Escreve interface

javac

ServidorImpl_Stub.class

Servidor.class

rmiregistry

java Servidor

ServidorCliente

Escreve cliente

Cliente.java

javac

Cliente.class

java Cliente

ServidorImpl.java

ServidorImpl_Stub.class

Exemplo: Cliente/Servidor RMI

Page 23: 5. Comunicacao entre Processos

45

�� Desenvolvimento de AplicaDesenvolvimento de Aplicaçções com RMIões com RMI�� Devemos definir a interface do servidor Devemos definir a interface do servidor

��A interface do servidor deve estender A interface do servidor deve estender javajava..rmirmi..RemoteRemote ou uma classe dela ou uma classe dela derivada (ex.: derivada (ex.: UnicastRemoteObjectUnicastRemoteObject))

��Todos os mTodos os méétodos da interface devem todos da interface devem prever a exceprever a exceçção ão javajava..rmirmi..RemoteExceptionRemoteException

��O Servidor irO Servidor iráá implementar esta interfaceimplementar esta interface�� StubsStubs e e skeletonsskeletons são gerados pelo compilador são gerados pelo compilador RMI (RMI (rmicrmic) com base na interface do servidor) com base na interface do servidor

Exemplo: Cliente/Servidor RMI

46

� Passo 1: definindo a interface remota� Descrever os métodos remotos que serão oferecidos ao cliente (RMIServidorInt.java);

import java.rmi.*;

public interface RMIServidorInt extends Remote {

public void mensagem(String str)

throws RemoteException;

}

� Passo 2: Implementar a interface do servidor declarada no passo 1.

Exemplo: Cliente/Servidor RMI

import java.rmi.*; public interface RMIServidorInt extends Remote {

public void mensagem(String str)throws RemoteException;

}

Page 24: 5. Comunicacao entre Processos

47

import java.rmi.*;import java.rmi.server.*;public class RMIServidorImpl extends UnicastRemoteObject

implements RMIServidorInt {public RMIServidorImpl() throws RemoteException {

super();}public void mensagem(String str) {

System.out.println(str);}

}

RMIServidorImpl.java

48

import java.rmi.Naming;public class Servidor {

public static void main(String args[]) throws Exception { System.err.println("Initializing server: please wait.");// cria um objetoRMIServidorImpl temp = new RMIServidorImpl();// bind o objeto RMIServidorImpl ao rmiregistryString serverObjectName = "//localhost/NomedoObjeto";Naming.rebind(serverObjectName, temp);System.out.println("O Servidor está pronto !");

}}

RMIServer.java

Page 25: 5. Comunicacao entre Processos

49

� Passo 2 (continuação): gerando o stub (código da comunicação).

c:\teste\javac RMIServidorImpl.java isso vai gerar RMIServidorImpl.classc:\teste\javac Servidor.java isso vai gerar Servidor.classc:\teste\rmic –v1.2 RMIServidorImplisso vai gerar RMIServidorImpl_Stub.classAtenção: uma cópia desse arquivo e a interface

devem ser fornecidos ao cliente.

Exemplo: Cliente/Servidor RMI

50

� Passo 3: Implementar o cliente de acordo com a interface do RMIServidorInt.

Exemplo: Cliente/Servidor RMI

import java.rmi.*;public class Cliente {

public static void main(String[] args) {try {

RMIServidorInt c =(RMIServidorInt)Naming.lookup("//localhost/ NomedoObjeto");

String m = "Hello World !";

c.mensagem(m);

} catch(Exception e) {System.out.println(e); // ou e.printStackTrace();

}}}

Page 26: 5. Comunicacao entre Processos

51

� Passo 4: compilar e executar o servidor e o cliente.- compilar o cliente:

c:\teste\javac Cliente.java - ativar o servidor de nomes (rmiregistry):

c:\teste\rmiregistryAtenção: tem que está no mesmo diretorio onde está

RMIServidorImpl_Stub.class- executando o servidor e cliente:

c:\teste\java Servidor c:\teste\java Cliente

Possíveis erros: classpath falta c:\teste

Exemplo: Cliente/Servidor RMI

52

Exemplo 2: Java RMIExemplo 2: Java RMI

�� Java RMI Java RMI –– Interface do ServidorInterface do Servidor�� ÉÉ implementada pelo servidorimplementada pelo servidor�� ÉÉ chamada pelo clientechamada pelo cliente�� Estende a interface Estende a interface javajava..rmirmi..RemoteRemote�� Todos os mTodos os méétodos devem prever a excetodos devem prever a exceçção ão javajava..rmirmi..RemoteExceptionRemoteException

public interface HelloWorld extends java.rmi.Remote {public String hello() throws java.rmi.RemoteException;

}

Page 27: 5. Comunicacao entre Processos

53

Java RMIJava RMI

�� Java RMI Java RMI –– ImplementaImplementaçção do Servidorão do Servidorimport java.rmi.*;import java.rmi.server.*;public class HelloServer extends UnicastRemoteObject

implements HelloWorld {public HelloServer() throws RemoteException {super();}public String hello() throws RemoteException {

return "Hello!!!";}public static void main(String[] args) {

try {HelloServer servidor = new HelloServer();Naming.rebind("//localhost/HelloWorld", servidor);

} catch (Exception e) { e.printStackTrace(); }}

}

54

Java RMIJava RMI

�� Java RMI Java RMI –– ImplementaImplementaçção do Clienteão do Clientepublic class HelloClient {

public static void main(String[] args) {try {

HelloWorld servidor = (HelloWorld) java.rmi.Naming.lookup("//localhost/HelloWorld");

String msg = servidor.hello();System.out.println("Mensagem do Servidor: "+msg);

} catch (Exception e) { e.printStackTrace(); }}

}

Page 28: 5. Comunicacao entre Processos

55

RMIRegitry

void rebind (String name, Remote obj) //Este método é usado por um servidor registrar o identificador de um objeto remoto //pelo nome void bind (String name, Remote obj) //Este método pode de maneira alternativa ser usado por um servidor registrar o //identificador de um objeto remoto pelo nome. //Se o nome já é ligado a uma referência remota uma exceção é levantada. void unbind (String name, Remote obj) //Este método remove um binding. Remote lookup(String name) //Este método é usado por um cliente para obter uma referência de objeto remoto. String[] list() //Este método retorna um array de Strings contendo nomes ligados no registro.

Interface do RMIRegistry

56

Java RMIJava RMI

�� RMI/IIOPRMI/IIOP�� A A partirpartir do Java 2.0, o RMI do Java 2.0, o RMI passoupassou a a permitirpermitira a utilizautilizaççãoão do do protocoloprotocolo IIOP (Internet InterIIOP (Internet Inter--ORB Protocol) do CORBAORB Protocol) do CORBA

�� IIOP IIOP tambtambéémm usausa TCP/IP, TCP/IP, masmas converteconverte ososdados dados parapara um um formatoformato padrãopadrão ((seralizaseralizaççãoão ououmarshallingmarshalling) ) diferentediferente do Java RMIdo Java RMI

�� Com RMI/IIOP, Com RMI/IIOP, objetosobjetos Java Java podempodem se se comunicarcomunicar com com objetosobjetos CORBA, CORBA, queque podempodemser ser escritosescritos emem outrasoutras linguagenslinguagens

Page 29: 5. Comunicacao entre Processos

57

Exercício 1import java.rmi.*;import java.rmi.server.*;import java.net.*;public interface Calculator extends Remote {

public long add(long a, long b)throws RemoteException;

public long sub(long a, long b)throws RemoteException;

public long mul(long a, long b)throws RemoteException;

public long div(long a, long b)throws RemoteException;

}

58

Exercício 2import java.rmi.*;import java.rmi.server.*;import java.net.*;public interface Banco extends Remote {

public String add(Conta correntista, short val)throws RemoteException;

public String rem(Conta correntista, short val)throws RemoteException;

public short saldo(Conta correntista)throws RemoteException;

public Conta cadastrar(String nome, short CPF)throws RemoteException;

}