terça-feira, 24 de agosto de 2010

Enviando Objetos via Socket

Antes de tudo, para enviar Objetos via socket para um Client/Servidor, precisamos SERIALIZAR o objeto a ser enviado. Conseguimos enviar uma String (que é um objeto) porque ela implementa Serializable em sua classe.
Se tiver um objeto próprio, implemente Serializable. Agora se tiver uma classe específica que baixou de algum lugar, como por exemplo org.jdom.Document ( jdom são classes para manipular  xml´s), podemos criar uma classe qualquer implementando Serializable somente para receber esse objeto.
Por exemplo:
import org.jdom.Document;

public class SerializeiDocument implements Serializable{

private static final long serialVersionUID = 1L;
private Document doc;

public Document getDoc() {
    return doc;
}

public void setDoc( Document doc ){
   this.doc = doc; 
}

}
Fazendo isso você já possui uma classe serializada que guarda uma instância do objeto que deseja enviar.

SerializeiDocument  doc = ( SerializeiDocument ) objInputStream.readObject() ;


A classe criada deve conter a mesma estrutura de package tanto no servidor, como no cliente.

Por fim, vamos enviar o objeto de um Cliente para um Servidor...

Classe jars.client.Cliente
import util.SerializeiDocument;
//outros imports...

public class Cliente {

Socket client = null;

ObjectOutputStream oos = null;
SerializeiDocument serialDoc;

public Client(){
    try{
    client = new Socket ( HOST, PORTA );
    oos = new ObjectOutputStream( client.getOutputStream() );
    //Supondo que serialDoc já esteja setado...
    oos.writeObject( serialDoc );
    oos.flush();
    }catch( Exception e ){ }
    finally{ 
        oos.close(); 
        client.close();
    }
}
Classe jars.server.Servidor
import utils.SerializeiDocument;
//outros imports...

public class Servidor {

     ServerSocket server;
     Socket client;

public void go(){
  try{
    server = new SocketServer( PORTA );
    client = server.accept();
    ObjectInputStream ois = new ObjectInputStream( client.getInputStream() );
    SerializeiDocumet sdoc = (SerializeiDocument) ois.readObject();
    //Pronto... sdoc está pronto para ser usado no servidor...
    }catch( Exception e ){}
    finally{ 
      ois.close();
      client.close();
   }
 }
}

3 comentários:

  1. Muito bom o exemplo ! Me ajudou bastante.

    Abraços

    ResponderExcluir
  2. Supondo que eu tenha mais de uma classe serializável. Como faço para testar qual classe o objeto é no recebimento?

    ResponderExcluir
    Respostas
    1. Você pode utilizar o instanceof do java.

      if ( objectDesesado instanceof objetoVerificarInstancia) {
      .......
      }

      Excluir