Pular para o conteúdo principal

Java e Redes: Consultando um serviço com Socket

Introdução

Neste post será abordada a utilização da Plataforma Java para desenvolvimento de um aplicativo de rede que consulta a um serviço do NIST- National Institute of Standars and Technology que fornece o horário oficial do EUA.
*Para saber mais visite http://www.time.gov/about.html e http://tf.nist.gov/tf-cgi/servers.cgi.

JSE e Networking

A Plataforma Java na sua versão padrão disponibiliza API que torna simples o desenvolvimento de aplicativos para rede. Conforme a própria documentação o pacote java.net pode ser dividido em duas seções:

Uma API de baixo nível com as seguintes abstrações:
  • Addresses, que representam identificadores de rede como endereços IP
  • Sockets, que representam mecanismo para comunicação bidirecional
  • Interfaces, que representam interfaces de rede
Uma  API de alto nível com as seguintes abstrações:
  • URIs, que representam Universal Resource Identifiers.
  • URLs, que representam Universal Resource Locators.
  • Connections, que representam conexões para recursos apontados pelas URLs.
No JSE são disponibilizadas também fábricas para criação de sockets no pacote javax.net.

Exemplo

Implementaremos o exemplo utilizando comunicação via TCP, que estabelece uma conexão confiável entre dois computadores. Neste contexto entenda como confiável, a garantia de entrega dos pacotes.

No exemplo utilizaremos a classe java.net.Socket que representa um endpoint para comunicação entre duas máquinas, e obteremos da resposta enviada pelo serviço através do fluxo de dados de leitura (InputStream) do Socket.

O serviço do NIST está disponível no host time-A.timefreq.bldrdoc.gov na porta 13, então será criado um socket para o serviço, conforme segue:
String host = "time-A.timefreq.bldrdoc.gov";
int porta = 13;
Socket socket = new Socket(host, porta);

Este construtor pode lançar duas exceções checadas, UnknownHostException, caso não seja possível determinar o endereço IP do host informado, e IOException, caso ocorra erro de I/O (entrada/saída) na criação do socket, além de poder lançar uma exceção não checada SecurityException, caso ocorra algum problema de segurança.

Após o Socket criado podemos obter o seu fluxo de dados por meio do método getInputStream(), como pode ser observado a seguir:
InputStream socketReader = socket.getInputStream();

E então podemos realizar a leitura do fluxo de dados obtido. Para realizar tal leitura faremos uso de classes que permitem a leitura do stream binário (socketReader) como um stream de caractere (charsReader) otimizado (lineReader), conforme código abaixo:

InputStream socketReader = socket.getInputStream();
InputStreamReader charsReader = new InputStreamReader(socketReader);
BufferedReader lineReader = new BufferedReader(charsReader);

Segue o código completo da classe que consulta o referido serviço:

package br.eti.castro.blog.samples.networking;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class ConsultaTimeServiceNIST {
 
 //o tratamento de excessoes foi simplificado 
 //(throws UnknownHostException, IOException)
 //para simplificar o entendimento do exemplo
 public static void main(String[] args) throws UnknownHostException, IOException {
  //declarando de objetos para a leitura do fluxo do socket
  BufferedReader lineReader = null;
  InputStreamReader charsReader = null;
  InputStream socketReader = null;
  String line = null;
  
  //criando o socket
  //para o host time-A.timefreq.bldrdoc.gov na porta 13
  String host = "time-A.timefreq.bldrdoc.gov";
  int port = 13;
  Socket socket = new Socket(host, port);
  //recuperando o fluxo de dados
  socketReader = socket.getInputStream();
  //montando o fluxo de leitura otimizado 
  charsReader = new InputStreamReader(socketReader);
  lineReader = new BufferedReader(charsReader);
  //enquanto existirem linhas para serem lidas
  //as mesmas srão impressas na saida padrao
  while((line = lineReader.readLine())!=null){
    System.out.println(line);
  }
  //fechamento do socket
  socket.close();
 }
}

A execução do código gerou o seguinte resultado, que representa o dia 14/02/2011 às 17h11m13s.

55606 11-02-14 17:11:13 00 0 0 0.0 UTC(NIST) * 

Teste o código, altere a classe e utilize um java.text.SimpleDateFormat para realizar a conversão do texto para um objeto da classe java.util.Date.

Até mais!
Marcelo de Castro
http://twitter.com/mcastroinfo
http://www.globalcode.com.br/instrutores/MarceloCastro
Outros posts: http://blog.globalcode.com.br/search/label/MarceloCastro

Comentários

Postagens mais visitadas deste blog

10 reasons why we love JSF

1. One-slide technology: it's so simple that I can explain basic JSF with one slide. 2. Easy to extend: components, listeners, render kit, Events, Controller, etc. 3. Real-world adoption: JBoss, Exadel, Oracle, IBM, ... 4. Architecture model: you can choose between more than 100 different architecture. 5. Open-mind community: using JSF you are going to meet very interesting people. 6. We are using JSF the last 5 years and we found very good market for JSF in Brazil 7. Progress: look to JSf 1.1 to JSF 1.2, JSF 1.2 to JSF 2.0. People are working really hard! 8. Many professionals now available 9. It's a standard. It's JCP. Before complain, report and help! 10. Ed Burns, spec leader, is an old Globalcode community friend! EXTRA: My wife is specialist in JSF. She's my F1 for JSF :) Nice job JSF community! -Vinicius Senger

Vem vindo novidade por ai... Minicurso de desenvolvimento iOS

Ola pessoal, Depois de uma conversa com a Yara, resolvemos colocar em prática uma idéia que já tinhamos a um tempo, que é aumentar as opções de mobilidade no portifólio da Globalcode e também da iniciativa Open4Education. E nesse caso estamos falando de um minicurso sobre desenvolvimento para iPhone e iPad. O objetivo desse minicurso vai ser mostrar que desenvolver para iOS não é tão complicado como se pode pensar e que não é preciso ter medo do Objective-C ! Serão algumas horas onde os alunos poderão entender os fundamentos da plataforma, como funciona o programa para desenvolvedores da Apple, preparação do ambiente e dos devices de teste e também um overview dos layers de desenvolvimento do iOS. Além disso, o objetivo também vai ser passar um pouco da minha experiência na "migração" que fiz de Java (seja SE, ME ou Android) para o novo mundo do Objective-C e Cocoa Touch. O material está no começo e ainda não temos uma data certa (só sabemos que a primeira edição desse minicu...

JavaMail: Enviando e-mail com Java

Introdução Além da necessidade de envio de e-mail ser comum a várias aplicações, foi a pergunta de um aluno da Academia Java ,  “Como enviar um e-mail com Java?”, que me motivou a escrever este post sobre JavaMail. JavaMail Para realizar o envio de e-mail por meio de uma aplicação Java, precisamos da biblioteca JavaMail, pois ela não é incluída no Java SE. A biblioteca está disponível em http://www.oracle.com/technetwork/java/index-138643.html . Neste download, além da biblioteca mail.jar que inclui a implementação completa da API e providers, também é disponibilizada a documentação da biblioteca ( javadoc ) na pasta docs , alguns exemplos na pasta demo e partes da implementação em lib . A forma mais simples de utilizar a JavaMail e incluir o mail.jar , porém para uma aplicação que só envia e-mail como o nosso exemplo, necessitamos apenas dos arquivos mailapi.jar e smtp.jar , economizando 177KB. Como a economia é pouca e as aplicações evoluem, vamos adicionar o mail.j...

Facelets uma forma mais ágil para construção de telas – Parte I

A construção de telas ou camada de apresentação em um sistema MVC seja web ou desktop é uma tarefa complexa e de extrema importância. Nesse post vou comentar e mostrar algum exemplo do Facelets como solução para os desafios existentes nessa etapa especificamente para web. Com a web cada vez mais presente em nosso dia-a-dia, um fato é que com isso nossos usuários tornam-se mais exigentes em relação a usabilidade, agilidade, performance ou de uma forma bem resumida “o usuário espera uma navegação simples e agradável aonde uma determinado tarefa possa ser concluída em poucos passos e em um curto espaço de tempo”. Atender as expectativas em relação ao que o usuário espera com o que realmente ele precisa, definir uma estrutura flexível a mudanças sem engessar o desenvolvimento, acessibilidade, portabilidade em múltiplos navegadores, tudo isso e muito mais, num prazo que quase sempre é apertado. Um outro ponto fundamental é manter o time motivado e produtivo em um ambiente que favoreça a...

JavaOne Brasil, dicas para submissão de palestras

Não quero parecer pretensiosa dando dicas para submissão de palestras para o JavaOne Brasil, mas sim repassar os tantos conselhos e sugestões recebidas pelos vetaranos do JavaOne: Bruno Souza e Leonardo Galvão que revisaram dezenas de submissões para o JavaOne e ajudaram a aprovar tantas palestras, e também misturar um pouco da minha experiência na seleção de palestras nos eventos realizados pela Globalcode e SouJava . 10 anos de JavaOne: http://www.globalcode.com.br/noticias/Globalcode10AnosNoJavaOne Os palestrantes ganham a entrada! A submissão pode ser feita em português! O passo mais importante para ser aprovado como palestrante no JavaOne é sem dúvida nenhuma submeter pelo menos uma palestra. Então, independente de qualquer coisa, participe, arrisque, divulgue.  Mas, se quiser aumentar as suas chances...   1) Leve a sério: peça para amigos fazerem uma leitura crítica do texto, e claro uma boa revisão ortográfica. 2) Submissão de várias palestras ou variações do ...

D.B.C.D. - Desenvolvimento baseado na "Caverna do Dragão"

Depois de muito tempo sem assistir este épico desenho, acabei topando com ele novamente enquanto esperava minhas crianças acordarem (é sério mesmo!). Assisti por 60 segundos e logo peguei meu laptop pois acabava de ter o meu último insigth do ano: você já imaginou ensinar desenvolvimento de software para aqueles personagens? Teríamos uma equipe PERFEITA, pense bem: - Bob: o jovem valente com um tacape aparentemente podereso, mas poucas vezes ajuda efetivamente. É o programador Ruby on Rails. - Daiana: teríamos aquela jovem com bastão mágico que pode dar longos pulos. Casa perfeitamente com metodologias ágeis e Sprint. - Erick: o bundão com aquele escudo. É o cara da auditoria PMI com pós em CMM. Sabe tudo de logs é expert em TXT. - Sheila: a fulana que tem a capa que pode sumir. Bem, essa nem precisa de explicação. Muitos programadores sofrem de síndrome de Sheila. - Presto: é o mágico que em situações extremas tenta tirar algo do chapéu, mas nunca funciona. Basicamente é...