Sie sind auf Seite 1von 14

1 de 14

Comunicao Distribuda: Socket, RMI, Web Service.


Leidiane Lima, Ednelson Junior
Universidade Federal do Oeste do Par
Programa de Computao
Sistemas Distribudos
I. Introduo
Neste trabalho apresentamos um tutorial de como desenvolver aplicaes que podem
estabelecer comunicao atravs da rede local ou atravs da internet, criamos os sockets, o
RMI e o Server Web utilizando Java. Os sockets originalmente foram desenvolvidos para o
BSD Unix, eles so compostos por um conjunto de primitivas do Sistema operacional. Os
sockets so suportados pela maioria das linguagens de programao, em Java por exemplo,
deve-se fazer uso das classes contidas no pacote Java.net desde o JDK.10. Alm disso,
podem ser utilizados nos mais variados sistemas operacionais com recursos de comunicao
em rede. O Java RMI um mecanismo para permitir a invocao de mtodos que residem em
diferentes mquinas virtuais Java (JVM). O JVM pode estar em diferentes mquinas ou podem
estar na mesma mquina. Em ambos os casos, o mtodo pode ser executado em um endereo
diferente do processo de chamada. Java RMI um mecanismo de chamada de procedimento
remoto orientada a objetos. O Web service designado a integrar sistemas desenvolvidos em
diferentes plataformas, como por exemplo, a integrao de sistemas do mundo Linux,
desenvolvido em PHP, com sistemas do mundo Windows, desenvolvido em Delphi com banco
de dados Access. Os Web Services podem ser baseados no protocolo SOAP ou no estilo
REST (chamados de RESTful). Ambos funcionam sob o protocolo HTTP, que o protocolo
padro de transferncia de documentos na Web. SOAP um dialeto XML utilizado para
descrever mensagens que so trocadas entre componentes SOA (Service Oriented
Architecture). Devido a constante necessidade de trabalhar em ambientes distribudos surgiram
essas alternativas, em Java, para tornar possvel a chamada de mtodos remotos e permitir
que aplicaes chamem mtodos de determinado objeto encontrados remotamente,
compartilhando recursos e processando a carga em outros computadores. O objetivo dessas
APIs facilitar a implementao desse tipo de aplicao, fazendo com que sistemas
distribudos sejam criados de forma parecida com aplicaes tradicionais. Neste trabalho a
implementao se d para a aplicao de gerenciamento de senha de banco.

2 de 14

II. Criando um Socket


A. Estrutura bsica de uma aplicao de rede.

Uma aplicao que utiliza sockets normalmente composta por uma parte servidora e
diversos clientes. Um cliente solicita determinado servio ao servidor, o servidor processa a
solicitao e devolve a informao ao cliente (ver Figura 1). Muitos servios podem ser
disponibilizados numa mesma mquina, sendo ento diferenciados no s pelo endereo IP,
mas tambm por um nmero de porta. Porm, o mais comum termos uma mquina dedicada
oferecendo apenas um ou dois servios, evitando assim a concorrncia.

Figura 1.
Os primeiros passo na criao do servidor, importar o pacote java.net , depois
instanciar um objeto do tipo ServerSocket, responsvel por atender pedidos via rede e em
determinada porta. Aps receber uma conexo, um objeto do tipo Socket deve ser criado para
manter a comunicao entre o cliente e o servidor.
A seguinte linha cria o ServerSocket, que ir esperar conexes numa determinada porta
(caso a porta definida j esteja em uso, uma exceo ser lanada):
ServerSocket server = new
ServerSocket(12345);
O prximo passo criar um objeto Socket, que ir tratar da comunicao com o cliente,
assim que um pedido de conexo chegar ao servidor e a conexo for aceita:
Socket client = server.accept();

3 de 14

O socket servidor precisa definir o nmero da porta para receber conexes dos clientes. Este
nmero pode variar entre 0 e 65535, porm, em nossas aplicaes s devemos utilizar de 1024
em diante, pois as portas com nmeros abaixo deste so reservados para o uso do sistema
(por exemplo a porta 80 usada pelo protocolo HTTP, 25 pelo SMTP, 110 pelo POP3, entre
vrios outros servios).Cada mquina conectada a uma rede possui um endereo IP nico de
maneira que possa ser identificada na rede. A classe InetAdress nos permite obter informaes
sobre um computador conectado a rede. Os principais mtodos desta classe so os seguintes:
getAddress(): Este mtodo retorna um array de bytes contendo o endereo IP. Para isso, o
nome do host que se deseja obter o endereo IP fornecido ao mtodo getByName da
classe InetAddress,
Exemplo:
byte[]bInetAddress.getByName("localhost").getAddress();
System.out.println(b[0] + "." + b[1] + "." + b[2] + "." + b[3]);
O mtodo abaixo retorna uma String contendo o endereo IP no formato: 999.999.999.999
getHostAddress()
Exemplo:
System.out.println("Endereo: " + InetAddress.getByName("localhost").getHostAddress() );
Dado um array de bytes contendo o endereo IP de um host, o mtodo abaixo retorna uma
String com o nome do host:
getHostName()
Exemplo
byte[] addr = {127,0,0,1};
System.out.println(InetAddress.getByAddress(addr).getHostName());
Para uma troca confivel de informaes, ou seja, quando necessria a confirmao de
recebimento da mensagem enviada, deve-se utilizar o protocolo TCP (Transmission Control
Protocol). Este protocolo estabelece uma conexo entre dois pontos interligados. Por exemplo,
uma mensagem enviada de um host a outro confirmada pelo host receptor indicando o
correto recebimento da mensagem. Uma mensagem pode ser enviada em vrios pacotes, o

4 de 14

TCP cuida para que os pacotes recebidos sejam remontados no host de destino na ordem
correta. Somente aps a montagem de todos os pacotes que as informaes ficam
disponveis para as aplicaes. A programao do TCP com sockets utiliza streams, isto
simplifica muito, o processo de leitura e envio de dados pela rede. Streams so objetos Java
que permitem obter dados de qualquer fonte de entrada, seja o teclado, um arquivo ou at
mesmo um fluxo de bytes recebidos pela rede. Isto torna a manipulao de dados da rede
como se fossem arquivos, ao ler dados enviados como se estivssemos lendo um arquivo e
ao enviar dados como se estivssemos gravando dados em um arquivo.
II. Criando um RMI
Conceitos Bsicos do RMI.

O RMI faz parte da especificao Java Standard Edition (Java SE), est presente desde
a verso 1.1 e a principal API para o desenvolvimento de sistemas distribudos do Java. O
Java RMI (Remote Method Invocation) permite que objetos Java executando no mesmo
computador ou em outros computadores comuniquem entre si por meio de chamadas de
mtodos remotos. Essas chamadas de mtodos so semelhantes quelas que ocorrem entre
objetos de um mesmo programa.
RMI est baseado em uma tecnologia anterior semelhante para programao
procedural, chamada de procedimentos remotos (Remote Procedure Calls, ou RPC),
desenvolvida nos anos 80.
Java RMI: Arquitetura
A arquitetura de Java RMI dividida em trs camadas:

A camada de stub/skeleton oferece as interfaces que os objetos da aplicao usam para

interagir entre si.

A camada de referncia remota responsvel por criar e gerenciar referncias para

objetos remotos;

A camada de transporte implementa o protocolo que especifica o formato de solicitaes

enviadas aos objetos remotos pela rede.

5 de 14

Figura 1 Arquitetura de camadas de RMI.

Java RMI: Implementao.


No desenvolvimento de uma aplicao cliente-servidor usando Java RMI, essencial que
seja definida a interface de servios que sero oferecidos pelo objeto servidor. A especificao
de uma interface remota equivalente definio de qualquer interface em Java, a no ser
pelos seguintes detalhes:
A interface dever, direta ou indiretamente, estender a interface Remote.
Todo mtodo da interface dever declarar que a exceo RemoteException (ou uma de suas
subclasses) pode ser gerada na execuo do mtodo.
O exemplo de definio de interface abaixo relaciona os mtodos que sero invocados
remotamente usando Java RMI. Este exemplo descreve uma aplicao de Chat onde clientes
interagem com o servidor conectando, enviando mensagens e desconectando. O servidor
interage com um cliente enviando mensagens de outros clientes.
public interface ServidorChat extends Remote {
public String conectar (Cliente c) throws RemoteException;
public void enviar (String mensagem) throws RemoteException;
public void desconectar(Cliente c) throws RemoteException;
}

6 de 14

J o cdigo mostrado a seguir descreve a interface de um cliente da aplicao de Chat, a


qual contm o mtodo exibir cuja funo mostrar a mensagem propagada pelo servidor da
aplicao.
public interface Cliente extends Remote {
public void Exibir(String mensagem) throws RemoteException;}
Em seguida, classe ServidorImpl que estende UnicastRemoteObject implementa os mtodos
remotos conectar, desconectar e enviar definidos na interface servidora citada acima.
public class ServidorImpl extends UnicastRemoteObject
implements Servidor {
O mtodo remoto conectar possui um vetor dinmico onde so armazenadas referncias
para os objetos clientes conectados aplicao.
public String conectar (Cliente c) throws RemoteException {
conectados.addElement(o);
return("Usuario Conectado");
}
O mtodo remoto desconectar elimina uma referncia remota armazenada no vetor de
clientes conectados.
public void desconectar (Cliente c) throws RemoteException {
conectados.remove(c);
}
O mtodo remoto enviar descrito abaixo obtm uma referncia para objetos dos clientes
atravs do vetor de conectados e envia as mensagens para os mesmos.
public void enviar (String mensagem) throws RemoteException {
do {
Cliente c =(Cliente) conectados.elementAt(i);
c.exibir(mensagem);
} while (i<conectados.size());}

7 de 14

O programa principal do servidor da aplicao de Chat responsvel por registrar o


objeto remoto do servidor no servio de nomes de Java RMI, por meio do mtodo
Naming.rebind (Servidor,s), onde Servidor o nome do objeto servidor e s uma
referncia para o mesmo.
public static void main (String[] args) {
try {
Servidor s= new ServidorImpl();
Naming.rebind("Servidor",s);
} catch (Exception e) {
System.out.println ("Erro no servidor: " + e.getMessage()); }
Descreve-se a seguir a implementao da aplicao cliente do sistema de Chat. A
principal classe do cliente denominada ClienteImpl. Essa classe implementa o mtodo exibir
definido na interface Cliente.
public class ClienteImpl extends UnicastRemoteObject
implements Cliente {
O mtodo exibir mostra as mensagens recebidas do servidor na tela do cliente.
public void exibe(String m) throws RemoteException {
try{
interface.append(m+"\n");
} catch(Exception e ){
System.out.println("Erro"+ e);
}
O programa principal do cliente responsvel por acessar o Servio de Nomes de Java
RMI e obter uma referncia remota para o objeto servidor. Dessa forma, o cliente poder se
conectar, enviar mensagens e se desconectar.
public static void main (String[] args) {
Servidor s= (Servidor) Naming.lookup("Servidor");
c.conectar(); // chamada remota

8 de 14

c.enviar(mensagem);
c.desconectar();
}
A execuo da aplicao cliente-servidor em RMI requer, alm da execuo da
aplicao cliente e da execuo da aplicao servidora, a execuo do Servidor de Nomes de
RMI. O aplicativo rmi registry faz parte da distribuio bsica de Java e encarregado de
executar o Servidor de Nomes. Tipicamente, esse aplicativo executado como um processo
em background que fica aguardando solicitaes em uma porta, que pode ser especificada
como argumento na linha de comando. Se nenhum argumento for especificado, a porta 1099
usada como padro. Em uma arquitetura de objetos distribudos, nem sempre a comunicao
no estilo cliente-servidor suficiente para atender aos requisitos de todas as aplicaes.
usual que um servidor RMI funcione algumas vezes como cliente, invertendo os papis com o
cliente original. O mecanismo para atingir esse objetivo chamado de callback. Esta tcnica
tipicamente utilizada quando a aplicao cliente requer um retorno do servidor mas no pode
permanecer bloqueada aguardando uma resposta. Atravs dessa tcnica, o servidor obtm
uma referncia para o cliente de forma que possa invocar remotamente um mtodo do mesmo.
Assim, quando a execuo do servio solicitado concluda, o servidor pode notificar o
cliente atravs da invocao do mtodo disponibilizado pelo mesmo para uso remoto.

III. Criando um Web Service


Conceitos Bsicos do Web Service
Web Service a ferramenta base para integrao de sistemas multiplataformas e
comunicao entre diferentes linguagens (Java com .NET, PHP com .NET, etc).
Por definio um Web Service alguma lgica de negcio acessvel usando padres da
Internet. O mais comum usar HTTP como protocolo de comunicao e XML para o formato
que apresenta os dados - justamente o que praticaremos aqui. Mas nada impede o uso de
outros formatos.
Uma tentativa de especificar mais ainda o XML dos Web Services so os padres SOAP e
WSDL. Junto com o protocolo HTTP, eles definem a base para comunicao de vrios servios
no mundo de aplicaes Enterprise. O SOAP e WSDL tentam esconder toda comunicao e
gerao do XML, facilitando assim o uso para quem no conhece os padres Web. No

9 de 14

treinamento FJ-31 veremos os detalhes sobre publicao e a criao de clientes baseados no


Web Services SOAP/WSDL.

Implementando Cliente Servidor


Em Java, os servios Web so definidos por classes. Um Web Service pode oferecer vrias
operaes, representada por um mtodo de classe. Uma prtica muito importante de ser
seguida sempre dividirmos a interface de um servio da sua implementao. A interface de
um servio chamada de SEI (Service Endpoint Interface) e a implementao chamada de
SIB (Service Implementation Bean).
Neste exemplo usaremos o bloco de notas para entendermos melhor tudo o que acontece,
diferente de utilizar um ambiente de desenvolvimento que muitas vezes abstraem diversos
detalhes que deveriam ser implementados.
Vamos iniciar a implementao criando um Web Service simples separada em SEI e SIB que
possui quatro operaes: soma, subtracao, divisao, multiplicao. O objetivo deste servio
retornar o calculo de uma das operaes invocadas pelo cliente. Segue abaixo o exemplo do
SEI para o nosso servio de calculadora. Salve o arquivo abaixo com o nome
CalculadoraServer.java dentro de uma pasta "calc".
Interface para o servio da calculadora:

10 de 14

Agora que a interface est criada e anotada corretamente vamos criar a implementao
da interface, ou seja, a nossa SEI onde sero implementados os mtodos definidos
anteriormente. Para isso precisamos criar a classe CalculadoraServerImpl.java que estar
salvo dentro da pasta calc. Segue abaixo a implementao:
Implementao da Interface do Servio.

listagem

acima
mais

nada

do

que

uma

implementao de uma classe como outra qualquer com os mtodos da interface descritos e
implementados.

No

entanto,

neste

cdigo

temos

uma

novidade,

propriedade

endpointInterface dentro da anotao @WebService.


Essa propriedade faz com que a classe atual, a SIB, ligue-se com a SEI especificada
anteriormente (calc.CalculadoraServer).
Publicando o servio
Agora que os arquivos j foram compilados podemos public-lo. Para isso precisamos gerar
o arquivo abaixo CalculadoraServerPublisher.java dentro da pasta calc juntamente com os
arquivo definidos anteriormente.
Publicando

servio.

11 de 14

Neste cdigo percebe-se o uso da classe Endpoint que est disponvel na linguagem Java e
que nos permite publicar um servio em um servidor. Para que possamos usa-la deve-se
passar como parmetro o endereo do servidor e a instncia do SIB do servio a ser publicado.
Notamos

que

servio

publicado

na

porta

9876.

Para verificarmos se tudo foi publicado corretamente basta acessar no browser o link:
http://127.0.0.1:9876/calc?wsd. Se tudo ocorrer perfeitamente poderemos visualizar o WSDL do
servio publicado. Com isso estamos prontos para usar o servio.
Usando o Servio
Agora que o servio est publicando, executando e pronto para ser usado, vamos criar um
cliente que acessar o Web Service criado anteriormente. O cdigo abaixo demonstra um
cliente para o nosso Web Service:
Cliente para o Web Service.

12 de 14

Neste cdigo pode-se observar que necessitamos passar o endereo do WSDL para a URL,
indicando onde o WSDL do servio poder ser encontrado. Na segunda linha passamos um
nome qualificado em XML para QName. Ele indica uma URI (namespace) e o nome do servio.
O namespace fornecido pela WSDL do servio, e o nome local a classe SIB acrescida da
palava Service. O nome local aparece na ltima seo do documento WSDL (seo service).
Por fim, na linha Service ws = ws.create(url, qname) temos como retorno uma referncia a
um objeto que pode invocar as operaes oferecidas pelo servio (em portType) e na prxima
linha finalmente acessamos a interface de ponto final (endpoint) do calc.CalculadoraServer,
que tipo SEI do servio, sendo capaz de acessar seus mtodos.

III.

Concluso

13 de 14

Graas as APIs Java, possvel realizar implementaes como o os Sockets, RMI, e Web
Services sem que o desenvolvedor tenha grandes preocupaes referentes a detalhes de
comunicao entre os diversos possveis elementos de um sistema. Atravs da utilizao da
arquitetura RMI, possvel que um objeto ativo em uma mquina virtual Java possa interagir
com objetos de outras mquinas virtuais Java, independentemente da localizao dessas
mquinas virtuais. A dificuldade maior no desenvolvimento das aplicaes foi em relao a
sincronizao e a lgica na comunicao entre os servios solicitados. Mas seguido os passos
relatados nos tutoriais foi possvel ter uma viso compreensvel e bem detalhada de como esse
tipo

de

servio

ou

aplicao

funcionam

na

prtica.

14 de 14

Referncias
[1]http://docs.oracle.com/javaee/6/tutorial/doc/bnayn.html. Em 02/08/2016, 10:20h.
[2] https://www.caelum.com.br/apostila-java-testes-jsf-web-services-design-patterns/acessandoum-web-service/#6-2-consumindo-dados-de-um-web-service.Em 02/08/2016, 10:20h.
[3]http://www.eclipse.org/webtools/community/education/web/t320/Implementing_a_Simple_We
b_Service.pdf.Em 03/08/2016, 22:20h.
[4] http://www.devmedia.com.br/introducao-ao-java-rmi/2012. Em 03/08/2016, 20:20h.
[5]

http://www.linhadecodigo.com.br/artigo/3654/desenvolvendo-e-usando-web-services-em-

java.aspx#ixzz4GN6bG3SG Em 03/08/2016, 21:00h

Das könnte Ihnen auch gefallen