Ajuda com envio de objetos por socket

5 respostas
lcharallo

Bom eu já pesquisei no Google já pesquisei nas API do java e até mesmo no GUJ mais não consigo descobrir porque o meu cliente não consegue enviar um objeto por socket para o servidor :!:

Classe Servidor

public class Servidor extends Thread {
    private  ServidorBd servidorBd;
    private  ArrayList clientes = new ArrayList();
    private Socket conexao;
    
    //Métodos Construtores
    public Servidor(Socket conexao) {
        this.conexao = conexao;
    }
    
    public Servidor() {
    }
    
    //Métodos de inicialização
    public static void main() {
        
        // main o acesso ao banco de dados do servidor
                servidorBd = new ServidorBd();

        // atualiza configuração do servidor
        System.out.println("O endereço atual do servidor é " + getIp());
        System.out.println("Iniciando configurações");
        CriaConfiguracao();
        System.out.println("Atualizando configurações");
        EnviaCofiguracao();
        System.out.println("Iniciando Servidor");
        try {
            // criando um socket que fica escutando a porta 2020.
            ServerSocket socket = new ServerSocket(2020);
            // Loop principal.
            while (true) {
                // aguarda algum cliente se conectar. A execução do
                // servidor fica bloqueada na chamada do método accept da
                // classe ServerSocket. Quando algum cliente se conectar
                // ao servidor, o método desbloqueia e retorna com um
                // objeto da classe Socket, que é porta da comunicação.
                System.out.println("Esperando alguem se conectar...");
                Socket conexao = socket.accept();
                System.out.println(" Novo cliente conectado!");
                // cria uma nova thread para tratar essa conexão
                Thread t = new Servidor(conexao);
                t.start();
                // voltando ao loop, esperando mais alguém se conectar.
            }
        } catch (IOException ex) {
            // caso ocorra alguma excessão de E/S, mostre qual foi.
            System.out.println("ocorreu um erro ao iniciar o servidor");
        }
    }
    
    //Execução da thread de recepção de mensagens
    //É aqui que as mensagens recebidas são manipuladas
    @Override
    public void run() {
        try {
            // Fluxo de entrada de dados
            ObjectInputStream entrada = new ObjectInputStream(conexao.getInputStream());  
            
            //Cria fluxo de envio de dados com o cliente e armazena em uma lista
            ObjectOutputStream saida = new ObjectOutputStream(conexao.getOutputStream());             
            clientes.add(saida);
            String tipo;
            String destinatario;
            while (true) {
                
                // espera por uma nova linha.
                tipo = (String)entrada.readObject();
                destinatario = (String)entrada.readObject();
                
                if(tipo.equals("cadastro")) {
                    Cadastro cadastro = (Cadastro)entrada.readObject();
                    System.out.println("" + cadastro.getLogin() + " solicitou um cadastro!");
                    servidorBd.addUsuario(cadastro.getLogin(), cadastro.getNome(), cadastro.getSenha());
                } if(tipo.equals("listaDeUsuarios")) {
                    ListaDeUsuarios lista = (ListaDeUsuarios)entrada.readObject();
                    System.out.println("" + lista.getRementente() + " solicitou atualização da lista de usuarios!");
                    ListaDeUsuarios respondeLista = new ListaDeUsuarios("servidor",lista.getRementente(),servidorBd.getLoginUsuarios());
                    enviaparaTodos(respondeLista);
                } if(tipo.equals("login")) {
                    Login login = (Login)entrada.readObject();
                    boolean autentica = servidorBd.autenticaUsuario(login.getLogin(), login.getSenha());
                    String nome = servidorBd.getNomeUsuario(login.getLogin());
                    Login respondeLogin = new Login("servidor",login.getLogin(),login.getLogin(),null,nome,autentica);
                    enviaparaTodos(respondeLogin);
                } if(tipo.equals("texto")) {
                    Texto texto = (Texto)entrada.readObject();
                    enviaparaTodos(texto);
                }else {
                    System.out.println("Uma mensagem de tipo desconhecido foi recebido pelo servidor!");
                    //objeto que vem junto é descartado
                    Object desconhecido = (Object)entrada.readObject();
                    System.out.println(desconhecido.toString());
                }
            }
        } catch (IOException ex) {
            System.out.println("IOException: " + ex);
            Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    //Métodos de comunicação
    private void enviaparaTodos(Mensagem mensagem) {
        Iterator it = clientes.iterator();
        String tipo = mensagem.getTipo();
        String destinatario = mensagem.getDestinatario();
        //percorre a ista que possui o fluxo de envio de dados dos clientes
        while(it.hasNext()) {
            try {
                ObjectOutputStream saida = (ObjectOutputStream) it.next();
                // envia para o servidor
                saida.writeObject(tipo);
                saida.writeObject(destinatario);
                saida.writeObject(mensagem); 
                //saida.close();
                System.out.println("uma mensagem enviada na boa...");
            } catch(Exception ex) {
                System.out.println("Erro ao enviar mensagem aos clientes");
            }
        }
    }
}

Classe Cliente

public class Cliente extends Thread {
    private String login;
    private String nome;
    private boolean autenticado;//indica se o usuario esta autenticado.
    private Socket conexao;
    private List<String> usuarios;
    private String ipServidor;
    
    //Métodos Construtores
    public Cliente(Socket s) {
        conexao = s;
    }
    
    //Métodos de inicialização
    public static void main() {
        try{
            Socket novaConexao = new Socket("127.0.0.1", 2020);
            // Uma vez que tudo está pronto, antes de iniciar o loop 
            // principal, executar a thread de recepção de mensagens.
            Thread t = new Cliente(novaConexao);
            t.start();
        }catch(Exception ex) {
            JOptionPane.showMessageDialog(null, "Não foi possivel estabelecer uma conexão com o servidor!");
        }
    }
    
    Cliente() {
    }
 
    //Execução da thread de recepção de mensagens
    //É aqui que as mensagens recebidas são manipuladas
    @Override
    public void run() {
        try {
            ObjectInputStream entrada = new ObjectInputStream(conexao.getInputStream());  
            String tipo;
            String destinatario;
            while (true) {
                // pega o que o servidor enviou
                tipo = (String)entrada.readObject();
                destinatario = (String)entrada.readObject();
                if(destinatario.equals(login)) {
                    if (tipo.equals("listaDeUsuarios")) {
                        ListaDeUsuarios lista = (ListaDeUsuarios)entrada.readObject();
                        usuarios = lista.getUsuarios();
                    } if (tipo.equals("login")) {
                        Login rlogin = (Login)entrada.readObject();
                        recebeRespostaLogin(rlogin);
                    } if (tipo.equals("texto")) {
                        Texto texto = (Texto)entrada.readObject();
                        recebeMensagenDeTexto(texto);
                    } else {
                        System.out.println("Uma mensagem de tipo desconhecido foi recebido pelo servidor!");
                        //objeto que vem junto é descartado
                        Object desconhecido = (Object)entrada.readObject();
                        System.out.println(desconhecido.toString());
                    }
                }
            }
        } catch (IOException ex) {
            System.out.println("IOException: " + ex);
        } catch (ClassNotFoundException ex) {
            System.out.println("IOException: " + ex);
        }
    }

    /**
     * Envia uma mensagem para o servidor
     * @param mensagem
     */
    private void enviaMensagem(Mensagem mensagem) {
        try{
            String tipo = mensagem.getTipo();
            String destinatario = mensagem.getDestinatario();
            ObjectOutputStream saida = new ObjectOutputStream(conexao.getOutputStream());  
            
            // envia para o servidor
            saida.writeObject(tipo);
            saida.writeObject(destinatario);
            saida.writeObject(mensagem); 
            
            //Encerra o fluxo de saida
            saida.close();
        } catch (IOException ex) {
            // Caso ocorra alguma excessão de E/S, mostre qual foi.
             JOptionPane.showMessageDialog(null, "falha ao enviar mensagem!");
        }
    }
    
    public void solicitaLogin(String login, String senha) {
        this.login = login;
        Login mensagem = new Login(this.login,"servidor", this.login, senha,"",false);
        //Destinatario,Rementente,Tipo,Login,Senha,getNome,Resposta;
        enviaMensagem(mensagem);
    }
    
    public void solicitaCadastro(String login,String nome,String senha) {
        this.login = login;
        Cadastro mensagem = new Cadastro(login, "servidor", login, nome,senha);
        enviaMensagem(mensagem);
    }
    
    public void solicitaListaDeUsuario() {
        if(this.autenticado) {
            ListaDeUsuarios mensagem = new ListaDeUsuarios(this.login,"servidor",null);
            enviaMensagem(mensagem);
        }
    }
    
    public void enviaMensagemDeTexto(String destinatario,String texto) {
        if(this.autenticado) {
            Texto mensagem = new Texto(this.login,destinatario,texto);
            enviaMensagem(mensagem);
        }
    }
    
    public void recebeMensagenDeTexto(Texto mensagem) {
        JOptionPane.showMessageDialog(null, mensagem.getRementente() + "disse :" + mensagem.getTexto());
    }
    
    private void recebeRespostaLogin(Login loginResposta) {
        boolean resposta = loginResposta.getResposta();
        this.autenticado = resposta;
        System.out.println("login atualisado para!");
        System.out.println(resposta);
    }
}

Observações...
As Classe Cadastro, ListaDeUsuarios, Login e Texto são todas classes estendidas da classe Mensagem e estão em um pacote .jar separado como uma biblioteca.
A Classe ServidorBd é a interface do servidor com o banco de dados.

5 Respostas

thiago.correa

E essas classes implementam Serializable?!
Coloca o erro que está acontecendo!

fantomas

Mas o que está acontecendo?

Você percebe algum tipo mensagem de erro ou algo assim, ou simplesmente executa e não acontece nada?

[]'s

lcharallo

thiago.correa:
E essas classes implementam Serializable?!
Coloca o erro que está acontecendo!

Caro thiago.correa sim os objetos que eu estou enviando estão implementados com a interface Serializable

lcharallo

fantomas:
Mas o que está acontecendo?

Você percebe algum tipo mensagem de erro ou algo assim, ou simplesmente executa e não acontece nada?

[]'s

fantomas hoje de noite quando eu estiver na minha casa eu posto aq a mensagem de erro

lcharallo

Se eu conseguir enviar um objeto por socket direitinho eu vou fazer um tutorial bem detalhado sobre isso :smiley:

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