Como identificar um objeto após receber ele por um soket?

5 respostas
lcharallo

Bom é um seguinte eu estou desenvolvendo uma aplicação cliente/servidor e estou trabalhando com socket e o meu problema é o seguinte eu envio uma mensagem em forma de um objeto e depois quando recebo no servidor eu uso o obj.getClass() para identificar que tipo de objeto é esse. Mas não ta funcionado alguem tem uma solução ou uma dica para o meu problema ?

aqui esta o metodo que recebe e deveria identificar o objeto que foi recebido

public void run() {
        try {
            Socket socket = this.conexao;
            

            ObjectInputStream entrada = new ObjectInputStream(socket.getInputStream());
            
            // Uma vez que se tem um cliente conectado e conhecido,
            // coloca-se fluxo de saída para esse cliente no vetor de
            // clientes conectados.
            ObjectOutputStream saida = new ObjectOutputStream(socket.getOutputStream());
            clientes.add(saida);
            
            Object mensagem;
            while (true) {
                
                // pega o que o cliente enviou
                mensagem = entrada.readObject();
                
                if (mensagem.getClass() == new Texto(null,null,null).getClass()) {

                    //a mensagem recebida é uma mensagem de texto
                    System.out.println("Uma mensagem foi recebida/enviada");
                    
                    Texto msgTexto = (Texto) mensagem;
                    
                    String remetente = msgTexto.getDestinatario();
                    String destinatario =  msgTexto.getRementente();
                    String texto = msgTexto.getTexto();
                    
                    Texto resposta = new Texto(remetente,destinatario, texto);
                    enviaparaTodos(resposta);

                } else if (mensagem.getClass() == new Login(null,null,null,null).getClass()) {

                    //a mensagem recebida é uma mensagem de login
                    System.out.println("Foi recebido uma solicitação de login");
                    
                    Login login = (Login) mensagem;
                    
                    String remetente = login.getDestinatario();
                    String destinatario =  login.getRementente();
                    String nome = servidorBd.getNomeUsuario(login.getLogin());
                    boolean reposta = servidorBd.autenticaUsuario(login.getLogin(), login.getSenha());
                    
                    Login resposta = new Login(remetente,destinatario, nome, reposta);
                    enviaparaTodos(resposta);
                    
                } else if (mensagem.getClass() == new ListaDeUsuarios(null,null,null).getClass()) {

                    //a mensagem recebida é uma mensagem de ListaDeUsuarios
                    System.out.println("Foi recebido uma solicitação atualização de lista de usuarios");
                    
                    ListaDeUsuarios listaDeUsuarios = (ListaDeUsuarios) mensagem;
                    
                    String remetente = listaDeUsuarios.getDestinatario();
                    String destinatario = listaDeUsuarios.getRementente();
                    HashMap<String,String> lista = servidorBd.getListaDeUsuarios();
                    
                    ListaDeUsuarios resposta = new ListaDeUsuarios(remetente,destinatario,lista);
                    enviaparaTodos(resposta);

                } else if (mensagem.getClass() == new Cadastro(null,null,null,null,null).getClass()) {

                    //a mensagem recebida é uma mensagem de Cadastro
                    System.out.println("Foi recebido uma solicitação de cadastro");
                    Cadastro cadastro = (Cadastro) mensagem;
                    servidorBd.addUsuario(cadastro.getLogin(),cadastro.getNome(), cadastro.getSenha());

                } else {
                    System.out.println("Foi recebido uma mensagem desconhecida !");
                }
            }
        } catch (IOException ex) {
            
            // caso ocorra alguma exceção de E/S, mostre qual foi.
            System.out.println("Não foi possivel encerrar a conexão com o cliente");
        } catch (ClassNotFoundException ex) {
            System.out.println("Opa! tivemos um problema para identificar um tipo de mensagem");
        } finally {
            try {
                this.finalize();
            } catch (Throwable ex) {
                System.out.println("Não foi possivel encerrar a thread de recepção de mensagens");
            }
        } 
    }

5 Respostas

Marky.Vasconcelos

Use o instanceof

if(mensagem instanceof Texto)

Ou então envie uma String e comparea com equals mesmo.

lcharallo

O instanceof não funcionou :?

vou tentar com String agora

valeu pela dica =D

PadrE

instanceof n rolou ??? como vc fez ??

se vc quizer saber o tipo e objeto, instanceof eh o que precisa…

e depois de ver são objetos do mesmo tipo, ai sim usar o equals…

if (objSocket instanceof MeuObjeto){ return ((MeuObjeto)objSocket ).equals(meuObjeto); }

Obs.: Preste atenção nas letras MAIUSCULAS e minusculas.

lcharallo

PadrE:
instanceof n rolou ??? como vc fez ??

se vc quizer saber o tipo e objeto, instanceof eh o que precisa…

e depois de ver são objetos do mesmo tipo, ai sim usar o equals…

if (objSocket instanceof MeuObjeto){ return ((MeuObjeto)objSocket ).equals(meuObjeto); }

Obs.: Preste atenção nas letras MAIUSCULAS e minusculas.

Então eu usei o stanceof assim

só mudei aonde era

if (mensagem.getClass() == new Texto(null,null,null).getClass())

para

if(mensagem instanceof Texto)
lcharallo

Então eu descobri aqui http://www.guj.com.br/posts/list/109468.java o que estava errado =D

agora é o fim do tratamento de string 8)

Criado 8 de novembro de 2008
Ultima resposta 12 de nov. de 2008
Respostas 5
Participantes 3