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

O que é Lógica de programação?

Este é o segundo de uma série de posts voltados aos leitores do blog que estão dando início à carreira de desenvolvimento de software. O assunto de hoje é a lógica de programação. Para ler antes: Entendendo como funciona a programação de computadores: linguagens de programação, lógica, banco de dados A lógica de programação é um pré-requisito para quem quer se tornar um desenvolvedor de software, independente da linguagem de programação que se pretende utilizar. Mas o que é de fato a Lógica de Programação e como saber se eu tenho esse pré-requisito? A lógica de programação nada mais é do que a organização coerente das instruções do programa para que seu objetivo seja alcançado. Para criar essa organização, instruções simples do programa, como mudar o valor de uma variável ou desenhar uma imagem na tela do computador, são interconectadas a estruturas lógicas que guiam o fluxo da execução do programa. Isso é muito próximo ao que usamos em nosso cotidiano para realizar atividad...

TDC BUSINESS, chega a São Paulo com novas trilhas de Inteligência Artificial e Inovação

Maior conferência de profissionais de tecnologia do Brasil abordará temas em alta no momento como, por exemplo, Inteligência Artificial, Segurança, Ciência de Dados e Inovação O TDC BUSINESS, a 17° edição do The Developer's Conference na cidade de São Paulo, que acontece entre os dias 19 e 21 de Setembro, reunirá profissionais e especialistas da área para troca de experiência, compartilhamento de conteúdos e networking. Com o tema central: “Tecnologia para negócios transformadores”, o evento será totalmente híbrido, ocorrendo presencialmente no espaço Pro Magno, e com transmissão simultânea e atividades de network pela internet. A expectativa é reunir mais de 14.000 pessoas, somando a participação presencial e online.   Segundo Yara Mascarenhas, Fundadora e Host do Evento, “nosso objetivo com o TDC é inspirar a colaboração entre os profissionais e empresas para construir uma nova realidade para o mercado de TI.  Vamos juntar tecnologia e negócios com as trilhas técnicas...

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 ...

12 ESQUENTAS TDC ESPERANDO POR VOCÊ

O TDC nasceu do sonho de profissionais que valorizam o compartilhamento de conhecimento, experiências e oportunidades entre as comunidades de desenvolvedores.  Por isso, o crescimento do TDC nunca poderia ficar longe do crescimento das comunidades! Pensando nessa união, criamos um projeto quente: O ESQUENTA TDC ! Visando divulgar os meetups de comunidades que querem transformar e inspirar carreiras, foi co-criado este projeto lindo e cheio de apoio, onde o TDC abraça meetups de diversas comunidades espalhadas pelo Brasil e elas contribuem com a divulgação da edição regente.  O TDC Innovation vai rolar de 14 a 16 de JUNHO, mas até lá vão acontecer muitos encontros incríveis!  Fique por dentro das comunidades que vão participar, quais temas irão abordar e claro as datas e locais para você participar. 💥Esquentas TDC Innovation 2023: 24/05 - Esquenta TDC: Carreira e Desenvolvimento Presencial em Floripa das 19:00 as 21:30 com inscrição AQUI Comunidade: Google Developer...

Sistema interativo de TV Digital com Ginga-J

No início de 2009, os estudantes de Sistema de Informação do Centro Universitário de Votuporanga ( UNIFEV ), Caio César Pereira de Souza e Rodrigo Gonçalves Constantino me apresentaram uma proposta para que eu fosse co-orientador junto ao professor orientador Djalma Domingos da Silva , em seu Trabalho de conclusão de curso (TCC) com tema TV Digital. A base que motivou o assunto, foi a palestra apresentada por Maurício Leal na I Conferência Java Noroeste sobre o tema TV Digital, realizada em 2006 em Votuporanga-SP. Ficamos muito entusiasmados com a possibilidade de interatividade na TV Digital, e a grande quantidade de possibilidades de desenvolvimento de aplicativos nesta área. Acompanhamos de perto as notícias na imprensa e todo o esforço e iniciativas realizadas pelo Fórum do Sistema Brasileiro de TV Digital Terrestre (SBTVD) , que organizou e produziu especificações ABNT, normatizando o sistema de TV Digital Terrestre. O foco do TCC foi realizar o desenvolvimento de uma pequena ...