Beruflich Dokumente
Kultur Dokumente
2 de 14
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:
objetos remotos;
5 de 14
6 de 14
7 de 14
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.
9 de 14
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
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-