Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
post favorito     comentários

Sockets com Java – Parte II

Aprenda a desenvolver aplicações em Java que comunicam-se via rede local ou internet...

[fechar]

Você não gostou da qualidade deste conteúdo?

(opcional) Você poderia comentar o que não lhe agradou?

Confirmo meu voto negativo

Aprenda a desenvolver aplicações em Java que comunicam-se via rede local ou internet

 

O protocolo TCP

Quando necessitamos de uma troca confiável de informações, isto é, quando é necessária a confirmação de recebimento da mensagem enviada, devemos utilizar o protocolo TCP (Transmission Control Protocol). Este protocolo estabelece uma conexão entre dois pontos interligados. Por exemplo, uma mensagem enviada de um host (o termo host representa uma máquina conectada na rede) a outro é confirmada pelo host receptor indicando o correto recebimento da mensagem. Uma mensagem pode ser enviada em vários pacotes, o TCP cuida para que os pacotes recebidos sejam remontados no host de destino na ordem correta (caso algum pacote não tenha sido recebido, o TCP requisita novamente este pacote). Somente após a montagem de todos os pacotes é que as informações ficam disponíveis para nossas aplicações. A programação do TCP com sockets utiliza streams, o que simplifica muito o processe de leitura e envio de dados pela rede.

 

Streams são 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 (o que é o nosso caso). Isto torna a manipulação de dados da rede como se fossem arquivos, ao ler dados enviados é como se estivéssemos lendo um arquivo e ao enviar dados é como se estivéssemos gravando dados em um arquivo.

 

Um primeiro servidor TCP

Vamos começar agora a trabalhar na prática com sockets. Primeiro vamos montar um servidor TCP que permite a seus clientes solicitarem a data e a hora atuais do servidor. A primeira versão deste servidor tem uma limitação (que mostraremos mais tarde como resolver): apenas um cliente pode ser atendido por vez.

 

Uma das características importantes do TCP é que os pedidos de conexões dos clientes vão sendo mantidos em uma fila pelo sistema operacional até que o servidor possa atendê-los. Isto evita que o cliente receba uma negação ao seu pedido, pois o servidor pode estar ocupado com outro processo e não conseguir atender o cliente naquele momento.

 

Cada sistema operacional pode manter em espera um número limitado de conexões até que sejam atendidas. Quando o sistema operacional recebe mais conexões que esse limite, as conexões mais antigas vão sendo descartadas.

 

Veja como funciona o nosso primeiro exemplo:

·         Ao ser iniciado o servidor fica ouvindo na porta 12345 a espera de conexões de clientes;

·         O cliente solicita uma conexão ao servidor;

·         O servidor exibe uma mensagem na tela com o endereço IP do cliente conectado;

·         O servidor aceita a conexão e envia um objeto Date ao cliente;

·         O cliente recebe o objeto do servidor e faz o cast necessário, em seguida exibe na tela as informações de data;

·         O servidor encerra a conexão.

 

Na Listagem 1 é apresentado o código do nosso primeiro exemplo de servidor e na Listagem 2 é apresentado o código do cliente que utiliza o nosso servidor.

 

Listagem 1. Código do servidor TCP básico

public class ServidorTCPBasico {

  public static void main(String[] args) {

    try {

      // Instancia o ServerSocket ouvindo a porta 12345

      ServerSocket servidor = new ServerSocket(12345);

      System.out.println("Servidor ouvindo a porta 12345");

      while(true) {

        // o método accept() bloqueia a execução até que

        // o servidor receba um pedido de conexão

        Socket cliente = servidor.accept();

        System.out.println("Cliente conectado: " + cliente.getInetAddress().getHostAddress());

        ObjectOutputStream saida = new ObjectOutputStream(cliente.getOutputStream());

        saida.flush();

        saida.writeObject(new Date());

        saida.close();

        cliente.close();

      }  

    }   

    catch(Exception e) {

       System.out.println("Erro: " + e.getMessage());

    }

    finally {...}  

  }     

}

 

Listagem 2. Código do cliente TCP básico

public class ClienteTCPBasico {

  public static void main(String[] args) {

    try {

      Socket cliente = new Socket("paulo",12345);

      ObjectInputStream entrada = new ObjectInputStream(cliente.getInputStream());

      Date data_atual = (Date)entrada.readObject();

      JOptionPane.showMessageDialog(null,"Data recebida do servidor:" + data_atual.toString());

      entrada.close();

      System.out.println("Conexão encerrada");

    }

    catch(Exception e) {

      System.out.println("Erro: " + e.getMessage());

    }

  }

}

 

Na Figura 2 podemos ver as mensagens exibidas pelo servidor ao receber conexões e na Figura 3 é apresentada a data atual do servidor recebida pelo cliente.

 

pcsocketjmp1fig02.JPG

Figura 2. Mensagens exibidas pelo servidor ao receber conexões de clientes

 

pcsocketjmp1fig03.JPG

Figura 3. Data e hora recebidas pelo cliente

 

Leia também



Paulo Sergio Pereira (psergio.p@terra.com.br) Bacharel em Ciência da Computação pela Univap (Universidade do Vale do Paraíba) é desenvolvedor Java, Progress, Visual Basic, Visual C++.NET e ADVPL. É administrador de bancos de dados [...]

O que você achou deste post?
Conhece a assinatura MVP?
Publicidade
Serviços

Mais posts