5. Comunicacao entre Processos
-
Upload
leonardo-nogueira -
Category
Documents
-
view
165 -
download
3
Transcript of 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
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?
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
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
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
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
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
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
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(); }}
}
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(); }}
}
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
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(); }
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
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(); }
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����
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
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(); }
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
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
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
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
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
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;
}
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
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();
}}}
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;
}
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(); }}
}
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
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;
}