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
Uma API de baixo nível com as seguintes abstrações:
Uma API de alto nível com as seguintes abstrações:
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
O serviço do NIST está disponível no host
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
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 (
Segue o código completo da classe que consulta o referido serviço:
A execução do código gerou o seguinte resultado, que representa o dia 14/02/2011 às 17h11m13s.
Teste o código, altere a classe e utilize um
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
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
- URIs, que representam Universal Resource Identifiers.
- URLs, que representam Universal Resource Locators.
- Connections, que representam conexões para recursos apontados pelas URLs.
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