Usando sockets em Java - Comunicação com um servidor

Publicado por Brenner Toledo em 05/09/2006

[ Hits: 24.169 ]

 


Usando sockets em Java - Comunicação com um servidor



Bom, estou aqui incluindo essa dica para quem ainda não sabe ou deseja aprender a usar Sockets na plataforma Java. Como estou montando um programa Java Cliente, essa dica vai ensinar a montar um Socket para comunicar-se com o Servido.
  • Socket => java.net.Socket; É o principal. Ele vai fazer a comunicação\conexão com o servidor.
  • BufferedReader => java.io.BufferedReader; É o que realizará a leitura de uma sentença mandada do Servidor, sendo de qualquer tipo: Integer, String, Char, Float, Boolean.. É importante ter noção que o programa pára para esperar a resposta. Ou seja, o comando readLine vai ficar no aguardo.
  • InputStreamReader => java.io.InputStreamReader; Será usado para ajudar na construção do BufferedReader; Não vai ter tanta importância nessa dica.
  • PrintWriter => java.io.PrintWriter; Este aqui mandará informações ao servidor. Usa-se o comando println para enviar uma linha texto (String).

Construindo o Socket:

Socket Conexao = new Socket(Servidor,Porta);

OBS: Quando o Socket é criado, ele automaticamente conecta. Se não conseguir conectar, ele cria uma excessão tipo IOException; Assim, deve-se usá-lo com a expressão try.

Construindo o BufferedReader:

BufferedReader input = new BufferedReader(new InputStreamReader(Conexao.getInputStream()));

OBS: Usamos o InputStreamReader apenas para criar, conforme dito antes. Conexao é o nome do Socket conectado.

Construindo o PrintWriter:

PrintWriter output = new PrintWriter(Conexao.getOutputStream(),true);

OBS: Conexão é o nome do Socket. O parâmetro true determina que o PrintWriter vai ser autoflush, ou seja, assim que o comando println for executado, ele automaticamente manda a mensagem para o Servidor, sem ter que usar o comando flush;

Segue abaixo uma classe exemplo de como usar o Socket. Tentei comentar o máximo possível para evitar dúvidas.

//as imports
import java.net.Socket;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.InputStreamReader;

public class ListProcess extends Thread {

    Socket conexao; //socket
    MeuFrame frame = new MeuFrame; //define e cria o Meu Frame

    public ListProcess() {
        //realiza a conexão no servidor local na porta 7847
        try {
        Socket conexao = new Socket("localhost", 7847 );
        } catch (IOException Ex) { //não consegui conectar
        this.interrupt();  // finaliza a Thread
        }

    }

    public void run(){ // para executar o processo
        if (conexao.isConnected() == true) { // se está conectado
            try {
                // criar os objetos que vão ler a entrada e saída do Socket
                BufferedReader input = new BufferedReader(new InputStreamReader(this.conexao.getInputStream())); //entrada

                PrintWriter output = new PrintWriter(this.conexao.getOutputStream(),true); // saída

                output.println("verprocessos"); // manda a mensagem pro servidor

                String Rc = "$beginlistprocess"; //nossa variável de controle do servidor
                
                //inicia um loop onde enquanto a mensagem não for a final e a conexão estiver ativa, ele inclui em uma lista no Frame os valores recebidos.
                while ((Rc!="$fimdalista")&&(Conexao.isConnected()==true)) {
                    //espera a resposta e coloca na variável
                    Rc=input.readLine();
                    //se a mensagem não é a final, então escreva na lista
                    if (Rc!="$endlistprocess")
                    //este item vai ser considerado Deprecation, mas ele funciona corretamente.
                    this.main.ListProcess.addItem(Rc);
                }
            } catch (Exception ex) { //se ocorrer alguma excessão.
            }
        }
    }
}

Espero ter ajudado.

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Transferência de arquivos binários em Java

Sistemas Distribuídos - Aplicação simples Java RMI

Sinal EOF ou EOT com sockets

Iniciando JBoss sem privilégios - Erro: "java.net.SocketException: Permission denied" [Resolvido]

Instalando e configurando Squid no CentOS 5.4

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts