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…
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
}