Ajuda ao Implementar LipeRMI

Boa tarde…

fiz um modelo simples de chat, uma classe chatServer e outra chatCliente

gostaria de implementar utilizando a API LipeRMI, quebrei a cabeça, mas naum consegui usar… :frowning:

se alguem poder me ajudar, eu agradeço muito…

segue abaixo os codigos das classes:

/*
 * chatServer.java
 *
 * Created on 5 de Junho de 2008, 13:30
 */

package chat.visao;

import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.SwingUtilities;

/**
 *
 * @author  Andre
 */
public class chatServer extends javax.swing.JFrame {
    private ServerSocket server; //socket de servidor
    private Socket conexao; //conexao com o cliente
    private int nroConexao = 1; //contador de numero de conexoes
    private ObjectOutputStream output; //gera fluxo de saida para p cliente
    private ObjectInputStream input; //gera fluxo de entrada a partir do cliente
    /** Creates new form chatServer */
    public chatServer() {
        super("Server");
        initComponents();
        
        cpEntrada.setEditable(false);
        
        setVisible(true);
        
        Thread chat = new Thread(
            new Runnable() {
                public void run() { 
                    runServer();
                }
            }
        );
        
        chat.start();
    }
    
    //configura e executa o servidor
    public void runServer() {
        try {
            server = new ServerSocket(1313, 1); //cria ServerSocket
            
            while(true) {
                try {
                    aguardandoConexao(); //espera uma conexao
                    getStreams(); //obtem fluxo de entrada e saida
                    processaConexao(); //processa a conexao
                } catch (EOFException eofExeception) {
                    enviaMensagem("\nServer terminou a conexão");
                } finally {
                    fechaConexao(); //fecha a conexao
                    nroConexao++;
                }
            } //fim do while
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
    } //fim do metodo runServer
    
    //metodo que espera que a conexao chegue e entao exibe informaçõe sobre a conexao
    private void aguardandoConexao() throws IOException {
        enviaMensagem("Aguardando Conexão\n");
        conexao = server.accept(); //permite que o servidor aceite conexao
        enviaMensagem("Conexão" + nroConexao + "recebida de: " + conexao.getInetAddress().getHostName());
    } //fim do metodo aguardandoConexao
    
    //metodo para obter fluxos para enviar e receber dados
    private void getStreams() throws IOException {
        //configura o fluxo de saida para objetos
        output = new ObjectOutputStream(conexao.getOutputStream());
        output.flush(); //esvazia buffer de saida para enviar as informações de cabeçalho
        
        //configura o fluxo de saida para objetos
        input = new ObjectInputStream(conexao.getInputStream());
        
        enviaMensagem("\nGot I/O streams\n");
    } //fim do metodo getStreams
    
    //metodo para processar a conexao com o cliente
    private void processaConexao() throws IOException {
        String mensagem = "Conectado com Sucessu";
        enviaDado(mensagem); //envia uma mensagem de conxao bem-sucedida
        
        //ativa cpEntrada de modo que usuario do servidor possa enviar mensagens
        setCpEntradaEditavel(true);
        
        //processa as mensagens enviadas pelo cliente
        do {
            try { //le e exibe a mensagem
                mensagem = (String) input.readObject(); //lê uma nova mensagem
                enviaMensagem("\n" + mensagem); //exibe a mensagem
            } catch (ClassNotFoundException classNotFoundException) {
                enviaMensagem("\nNão é possivel enviar esse tipo de objeto");
            }
        } while(!mensagem.equals("CLIENTE>>> TERMINADO"));
    } //fim do metodo processaConexao
    
    //metodo para fechar os fluxos e o socket
    private void fechaConexao() {
        enviaMensagem("\nFim da Conexão");
        setCpEntradaEditavel(true); //desativa cpEntrada
        
        try {
            output.close();
            input.close();
            conexao.close();
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
    } //fim do metodo fechaConexao
    
    //metodo para enviar dados ao clinte
    private void enviaDado(String mensagem) {
        try { //envia o objeto ao clinte
            output.writeObject("SERVER>>>" + mensagem);
            output.flush(); //esvazia a saida para o cliente
            enviaMensagem("\nSERVER>>>" + mensagem);
        } catch (IOException ioExcepion) {
            areaTexto.append("Erro criando objeto");
        }
    } //fim do metodo enviaDado
    
    //metodo para manipular a areaTexto na thread de despachos de eventos
    private void enviaMensagem(final String menssagePara) {
        SwingUtilities.invokeLater(
                new Runnable() {
                public void run() {  //atualiza a areaTexto
                    areaTexto.append(menssagePara); //acrescenta a mesnagem
                } //fim do run
            } //fim da classe interna anonima
        ); // fim da chamada SwingUtilities.invokeLater
    } //fim do metodo enviaMensagem
    
    //manipula o cpEntrada na thread de despalchos de eventos
    public void setCpEntradaEditavel(final boolean editavel) {
        SwingUtilities.invokeLater(
                new Runnable() {
                public void run() {  //configura a editabilidade do cpEntrada
                    cpEntrada.setEditable(editavel);
                } //fim do run
            } //fim da classe interna anonima
        ); // fim da chamada SwingUtilities.invokeLater
    } //fim do metodo setCpEntradaEditavel
    
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        areaTexto = new javax.swing.JTextArea();
        cpEntrada = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        areaTexto.setColumns(20);
        areaTexto.setRows(5);
        jScrollPane1.setViewportView(areaTexto);

        cpEntrada.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cpEntradaActionPerformed(evt);
            }
        });

        jLabel1.setFont(new java.awt.Font("Verdana", 1, 12));
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("Mini Chat para teste Aplicação Servidor");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                    .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                    .addComponent(cpEntrada, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addGap(22, 22, 22)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 171, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(cpEntrada, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>                        

    //envia a mensagem ao cliente
    private void cpEntradaActionPerformed(java.awt.event.ActionEvent evt) {                                          
        // TODO add your handling code here:
        enviaDado(evt.getActionCommand());
        cpEntrada.setText("");
    }                                         
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new chatServer().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify                     
    private javax.swing.JTextArea areaTexto;
    private javax.swing.JTextField cpEntrada;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    // End of variables declaration                   
    
}




/*
 * Server.java
 *
 * Created on 5 de Junho de 2008, 13:30
 */

package chat.visao;

import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import javax.swing.SwingUtilities;

/**
 *
 * @author  Andre
 */
public class chatClient extends javax.swing.JFrame {
    private String chatServer; //servidor para comunicação
    private Socket client;
    private ObjectOutputStream output;
    private ObjectInputStream input;
    private String mensagem;
    /** Creates new form Server */
    public chatClient(String host) {
        super("Client");
        
        chatServer = host; //configura o servidor ao qual esse cliente se conconecta
        
        initComponents();
        
        cpEntrada.setEditable(false);

        setVisible(true);
        
        Thread chat = new Thread(
            new Runnable() {
                public void run() { 
                    runClient();
                }
            }
        );
        
        chat.start();
    }
    
    //conecta ao servidor e processa as mensagens a partir do servidor
    public void runClient() {
        try { //conecta-se ao servidor, obtem fluxo, processa a conexao
            conectaServidor(); //cria um Socket para fazer a conexão
            getStreams(); //obtem os fluxos de entrada e saida
            processaConexao(); //processa a conexao
            
        } catch(EOFException eofException) {
            enviaMensagem("\nClient terminou a conexao");
        } catch(IOException ioException) {
            ioException.printStackTrace();
        } finally {
            fechaConexao(); //fecha a conexao
        }
    } //fim do metodo runClient
    
    //conecta ao servidor
    private void conectaServidor() throws IOException {
        enviaMensagem("Conexao aceita\n");
        
        //cria Socket para fazer a conexao ao servidor
        client = new Socket(chatServer,1313);
        
        //exibe informação sobre a conexao
        enviaMensagem("Conectado a: " + client.getInetAddress().getHostName());
    } // fim do metodo conectaServidor
    
    //obtem fluxos para enviar e receber dados
    private void getStreams() throws IOException {
        //configura o fluxo de saida para objetos
        output = new ObjectOutputStream(client.getOutputStream());
        output.flush(); //esvazia buffer de saida para enviar as informações de cabeçalho
        
        //configura o fluxo de entrada para objetos
        input = new ObjectInputStream(client.getInputStream());
        
        enviaMensagem("\nGot I/O streams\n");
        
    } //fim do metodo getStreams
    
    //processa a conexão com o servidor
    public void processaConexao() throws IOException {
        //ativa cpEntrada de modo que o usuario cliente possa enviar mensagens
        setCpEntradaEditavel(true);
        
        //processa as mensagens enviadas pelo servidor
        do {
            try { //le e exibe a mensagem
                mensagem = (String) input.readObject(); //lê uma nova mensagem
                enviaMensagem("\n" + mensagem); //exibe a mensagem
            } catch (ClassNotFoundException classNotFoundException) {
                enviaMensagem("\nNão é possivel enviar esse tipo de objeto");
            }
        } while(!mensagem.equals("SERVER>>> TERMINADO"));
    } //fim do metodo processaConexao
    
    //metodo para fechar os fluxos e o socket
    private void fechaConexao() {
        enviaMensagem("\nFim da Conexão");
        setCpEntradaEditavel(true); //desativa cpEntrada
        
        try {
            output.close();
            input.close();
            client.close();
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
    } //fim do metodo fechaConexao
    
    //metodo para enviar dados ao servidor
    private void enviaDado(String mensagem) {
        try { //envia o objeto ao servidor
            output.writeObject("CLIENT>>>" + mensagem);
            output.flush(); //esvazia a saida para o servidor
            enviaMensagem("\nCLIENT>>>" + mensagem);
        } catch (IOException ioExcepion) {
            areaTexto.append("Erro criando objeto");
        }
    } //fim do metodo enviaDado
    
    //metodo para manipular a areaTexto na thread de despachos de eventos
    private void enviaMensagem(final String menssagePara) {
        SwingUtilities.invokeLater(
                new Runnable() {
                public void run() {  //atualiza a areaTexto
                    areaTexto.append(menssagePara); //acrescenta a mesnagem
                } //fim do run
            } //fim da classe interna anonima
        ); // fim da chamada SwingUtilities.invokeLater
    } //fim do metodo enviaMensagem
    
    //manipula o cpEntrada na thread de despalchos de eventos
    public void setCpEntradaEditavel(final boolean editavel) {
        SwingUtilities.invokeLater(
                new Runnable() {
                public void run() {  //configura a editabilidade do cpEntrada
                    cpEntrada.setEditable(editavel);
                } //fim do run
            } //fim da classe interna anonima
        ); // fim da chamada SwingUtilities.invokeLater
    } //fim do metodo setCpEntradaEditavel
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        areaTexto = new javax.swing.JTextArea();
        cpEntrada = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        areaTexto.setColumns(20);
        areaTexto.setRows(5);
        jScrollPane1.setViewportView(areaTexto);

        cpEntrada.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cpEntradaActionPerformed(evt);
            }
        });

        jLabel1.setFont(new java.awt.Font("Verdana", 1, 12));
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("Mini Chat para teste Aplicação Cliente");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                    .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                    .addComponent(cpEntrada, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addGap(22, 22, 22)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 171, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(cpEntrada, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void cpEntradaActionPerformed(java.awt.event.ActionEvent evt) {                                          
        // TODO add your handling code here:
        enviaDado(evt.getActionCommand());
        cpEntrada.setText("");
    }                                         
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new chatClient("127.0.0.1").setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify                     
    private javax.swing.JTextArea areaTexto;
    private javax.swing.JTextField cpEntrada;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    // End of variables declaration                   
    
}