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

Upload: leonardo-nogueira

Post on 05-Jul-2015

165 views

Category:

Documents


3 download

TRANSCRIPT

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;

}