Chat em Java usando objetos

0 respostas
M

Boa tarde. Estou tentando fazer um chat e estou com um erro que não consigo identificar a origem: 'invalid type code: AC'.

O erro ocorre após a conexão do usuário, quando tento escrever uma mensagem.

Seguem as classes:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jogo;

import java.io.Serializable;

/**
 *
 * @author marcio
 */
public class Usuario implements Serializable {
    private String nome;
    
    public Usuario(String nome) {
        this.nome = nome;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        return hash;
    }
    
    @Override
    public boolean equals(Object o) {
        if (o instanceof Usuario) {
            return ((Usuario) o).getNome().equals(getNome());
        }
        
        return false;
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jogo;

import java.io.*;
import java.net.Socket;

/**
 *
 * @author marcio
 */
public class SocketCliente extends Thread {
    private static Socket conexao;
    private static Usuario usuario;

    public SocketCliente(Socket socket) {
        conexao = socket;
    }

    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("127.0.0.1", 9999);

        BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("Digite seu nome:");

        String nome = teclado.readLine();

        usuario = new Usuario(nome);

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

        saida.writeObject(usuario);

        saida.reset();

        Thread execucao = new SocketCliente(socket);

        execucao.start();

        while (true) {

            System.out.println("Mensagem >");

            String texto = teclado.readLine();

            Mensagem mensagem = new Mensagem(texto, usuario, null);

            saida.writeObject(mensagem);

            saida.flush();
        }
    }

    @Override
    public void run() {
        try {
            ObjectInputStream entrada = new ObjectInputStream(conexao.getInputStream());

            while (true) {
                Mensagem mensagem = (Mensagem) entrada.readObject();

                if (usuario.equals(mensagem.getDestinatario())) {
                    System.out.println(mensagem.getDestinatario().getNome() + " disse > " + mensagem.getMensagem());

                    System.out.println("Responder >");
                }
            }
        } catch (IOException e) {
            System.out.println("Erro 3: " + e.getMessage());
        } catch (ClassNotFoundException e) {
            System.out.println("Erro 4: " + e.getMessage());
        }
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jogo;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

/**
 *
 * @author marcio
 */
public class SocketServidor extends Thread {
    private static ArrayList<Usuario> usuarios;
    private Socket conexao;
    private Usuario servidor;

    public SocketServidor(Socket conexao) {
        this.conexao = conexao;
        this.servidor = new Usuario("servidor");
    }

    public static void main(String[] args) throws Exception {        
        usuarios = new ArrayList<Usuario>();
        
        ServerSocket serverSocket = new ServerSocket(9999);
        
        System.out.println("Servidor rodando");

        while (true) {
            Socket socket = serverSocket.accept();

            Thread execucao = new SocketServidor(socket);

            execucao.start();
        }
    }

    @Override
    public void run() {
        ObjectInputStream entrada;
        try {
            entrada = new ObjectInputStream(conexao.getInputStream());

            Object leitura = entrada.readObject();

            Usuario usuario = (Usuario) leitura;

            if (usuarios.contains(usuario)) {
                System.out.println(usuario.getNome() + " já está na sala.");
                conexao.close();
                return;
            } else {
                System.out.println(usuario.getNome() + " conectado.");
                
                Mensagem mensagem = new Mensagem(usuario.getNome() + " entrou na sala.", servidor, null);
               
                envia(mensagem);
                
                usuarios.add(usuario);
            }

            while (true) {
                Object objeto = entrada.readObject();

                if (objeto instanceof Mensagem) {
                    Mensagem mensagem = (Mensagem) objeto;

                    envia(mensagem);
                }
            }

        } catch (IOException e) {
            System.out.println("Erro 1: " + e.getMessage());
        } catch (ClassNotFoundException e) {
            System.out.println("Erro 2: " + e.getMessage());
        }
    }
    
    public void envia(Mensagem mensagem) throws IOException {
        ObjectOutputStream saida = new ObjectOutputStream(conexao.getOutputStream());

        for (Usuario usuario : usuarios) {
            if (!mensagem.getRemetente().equals(usuario)) {
                if ((mensagem.getDestinatario() == null) || (mensagem.getDestinatario().equals(usuario))) {
                    mensagem.setDestinatario(usuario);

                    saida.writeObject(mensagem);
                }
            }
        }
    }
}

Alguém pode ajudar?

Criado 16 de abril de 2012
Respostas 0
Participantes 1