Boa tarde a todos!
Bem pessoal, estou implementando um exemplo do Deitel utilizando sockets para fazer um chat de Cliente>>Servidor (e vice-versa).
Estou fazendo a interface gráfica pelo designer do NetBeans, e a princípio ele não parece ter nenhum erro, mas quando executo,
dou um clique no botão "Conectar" e, ele simplesmente trava.
Gostaria de saber o que eu posso estar fazendo errado. Agradeço a atenção.
Segue o projeto do NetBeans em anexo:
Segue o código do lado do Cliente:
package redes;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class TelaCliente extends javax.swing.JFrame {
ObjectOutputStream output;
ObjectInputStream input;
String message = "";
String nome = "Cliente";
String ip = "localhost";
int porta = 5050;
public TelaCliente() {
initComponents();
tx_resultado.setEditable(false);
tx_escreva.setEnabled(false);
bt_enviar.setEnabled(false);
}
public void Inicia() {
Socket client;
try {
tx_resultado.setText("Aguardando conexão...\n");
client = new Socket(InetAddress.getByName(ip), porta);
tx_resultado.append("Conectado a: " + client.getInetAddress().getHostName());
output = new ObjectOutputStream(client.getOutputStream());
output.flush();
input = new ObjectInputStream(client.getInputStream());
tx_escreva.setEnabled(true);
bt_enviar.setEnabled(true);
do {
try {
message = (String) input.readObject();
tx_resultado.append("\n" + message);
tx_resultado.setCaretPosition(tx_resultado.getText().length());
} catch (ClassNotFoundException cnfex) {
tx_resultado.append("\nNenhuma mensagem recebida.");
}
} while (!message.equals("Servidor: TERMINATE"));
tx_resultado.append("Fechando conexão....\n");
output.close();
input.close();
client.close();
} catch (EOFException eof) {
System.out.println("O servidor encerrou a conexão.");
} catch (IOException e) {
e.printStackTrace();
} finally {
bt_enviar.setEnabled(true);
tx_escreva.setEnabled(true);
}
}
public void EnviaDados(String s) {
try {
message = s;
output.writeObject(nome + ": " + s);
output.flush();
tx_resultado.append("\n" + nome + ": " + s);
} catch (IOException cnfex) {
tx_resultado.append("\nErro ao enviar os dados. É possível que o Servidor tenha se desconectado.");
} finally {
bt_enviar.setEnabled(true);
tx_escreva.setEnabled(true);
}
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
tx_ip = new javax.swing.JTextField();
jLabel2 = new javax.swing.JLabel();
tx_porta = new javax.swing.JTextField();
tx_nome = new javax.swing.JTextField();
jLabel3 = new javax.swing.JLabel();
bt_conectar = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
tx_resultado = new javax.swing.JTextArea();
bt_enviar = new javax.swing.JButton();
tx_escreva = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Cliente");
setLocationByPlatform(true);
setResizable(false);
jLabel1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
jLabel1.setText("IP:");
tx_ip.setText("localhost");
jLabel2.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
jLabel2.setText("Porta:");
tx_porta.setText("5050");
tx_nome.setText("Cliente");
jLabel3.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
jLabel3.setText("Nome:");
bt_conectar.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
bt_conectar.setText("Conectar");
bt_conectar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
bt_conectarActionPerformed(evt);
}
});
tx_resultado.setColumns(20);
tx_resultado.setRows(5);
jScrollPane1.setViewportView(tx_resultado);
bt_enviar.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
bt_enviar.setText("Enviar");
bt_enviar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
bt_enviarActionPerformed(evt);
}
});
tx_escreva.setText("Escreva aqui.");
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)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tx_ip, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tx_porta, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(tx_nome)
.addComponent(bt_conectar, javax.swing.GroupLayout.DEFAULT_SIZE, 106, Short.MAX_VALUE)))
.addComponent(jScrollPane1)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(tx_escreva)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(bt_enviar)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
.addComponent(tx_ip, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel2)
.addComponent(tx_porta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel3)
.addComponent(tx_nome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(bt_conectar)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 188, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(bt_enviar)
.addComponent(tx_escreva, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap())
);
pack();
}// </editor-fold>
private void bt_conectarActionPerformed(java.awt.event.ActionEvent evt) {
//nome = tx_nome.getText();
porta = Integer.parseInt(tx_porta.getText());
ip = tx_ip.getText();
Inicia();
bt_conectar.setEnabled(false);
}
private void bt_enviarActionPerformed(java.awt.event.ActionEvent evt) {
EnviaDados(tx_escreva.getText());
bt_enviar.setEnabled(false);
}
public static void main(String args[]) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Metal".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(TelaCliente.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(TelaCliente.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(TelaCliente.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(TelaCliente.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new TelaCliente().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton bt_conectar;
private javax.swing.JButton bt_enviar;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextField tx_escreva;
private javax.swing.JTextField tx_ip;
private javax.swing.JTextField tx_nome;
private javax.swing.JTextField tx_porta;
private javax.swing.JTextArea tx_resultado;
// End of variables declaration
}
[size=14]E do lado do Servidor:[/size]
package redes;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TelaServidor extends javax.swing.JFrame {
ObjectOutputStream output;
ObjectInputStream input;
int porta = 5050;
String nome = "Servidor";
public TelaServidor() {
initComponents();
setLocationRelativeTo(null);
tx_resultado.setEditable(false);
tx_escreva.setEnabled(false);
bt_enviar.setEnabled(false);
}
public void Inicia() {
ServerSocket server;
Socket connection;
int counter = 1;
try {
server = new ServerSocket(porta, 100);
while (true) {
tx_resultado.setText("Aguardando conexão...\n");
connection = server.accept();
tx_resultado.append("Conexão " + counter + " recebida de: "
+ connection.getInetAddress().getHostName());
output = new ObjectOutputStream(connection.getOutputStream());
output.flush();
input = new ObjectInputStream(connection.getInputStream());
String message = nome + ": Conectado com Sucesso!";
output.writeObject(message);
output.flush();
tx_escreva.setEnabled(true);
bt_enviar.setEnabled(true);
do {
try {
message = (String) input.readObject();
tx_resultado.append("\n" + message);
tx_resultado.setCaretPosition(tx_resultado.getText().length());
} catch (ClassNotFoundException cnfex) {
tx_resultado.append("\nNenhuma mensagem recebida.");
}
} while (!message.equals("Cliente: TERMINATE"));
tx_resultado.append("\nO Cliente encerrou a conexão.");
bt_conectar.setEnabled(false);
output.close();
input.close();
connection.close();
++counter;
}
} catch (EOFException eof) {
System.out.println("O Cliente encerrou a conexão.");
} catch (IOException io) {
io.printStackTrace();
} finally {
bt_enviar.setEnabled(true);
tx_escreva.setEnabled(true);
}
}
public void EnviaDados(String s) {
try {
output.writeObject(nome + ": " + s);
output.flush();
tx_resultado.append("\n" + nome + ": " + s);
} catch (IOException cnfex) {
tx_resultado.append("\nErro ao enviar os dados. É possível que o Cliente tenha se desconectado.");
} finally {
bt_enviar.setEnabled(true);
tx_escreva.setEnabled(true);
}
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel3 = new javax.swing.JLabel();
tx_porta = new javax.swing.JTextField();
jLabel2 = new javax.swing.JLabel();
bt_enviar = new javax.swing.JButton();
tx_nome = new javax.swing.JTextField();
jScrollPane1 = new javax.swing.JScrollPane();
tx_resultado = new javax.swing.JTextArea();
bt_conectar = new javax.swing.JButton();
tx_escreva = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Servidor");
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
setResizable(false);
jLabel3.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
jLabel3.setText("Nome:");
tx_porta.setText("5050");
jLabel2.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
jLabel2.setText("Porta:");
bt_enviar.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
bt_enviar.setText("Enviar");
bt_enviar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
bt_enviarActionPerformed(evt);
}
});
tx_nome.setText("Servidor");
tx_resultado.setColumns(20);
tx_resultado.setRows(5);
jScrollPane1.setViewportView(tx_resultado);
bt_conectar.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
bt_conectar.setText("Conectar");
bt_conectar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
bt_conectarActionPerformed(evt);
}
});
tx_escreva.setText("Escreva aqui.");
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)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tx_porta, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tx_nome)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(bt_conectar, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(tx_escreva, javax.swing.GroupLayout.DEFAULT_SIZE, 308, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(bt_enviar)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(bt_conectar)
.addComponent(jLabel2)
.addComponent(tx_porta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel3)
.addComponent(tx_nome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 197, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(bt_enviar)
.addComponent(tx_escreva, 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 bt_conectarActionPerformed(java.awt.event.ActionEvent evt) {
//nome = tx_nome.getText();
porta = Integer.parseInt(tx_porta.getText());
Inicia();
bt_conectar.setEnabled(false);
}
private void bt_enviarActionPerformed(java.awt.event.ActionEvent evt) {
EnviaDados(tx_escreva.getText());
bt_enviar.setEnabled(false);
}
public static void main(String args[]) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Metal".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(TelaServidor.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(TelaServidor.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(TelaServidor.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(TelaServidor.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new TelaServidor().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton bt_conectar;
private javax.swing.JButton bt_enviar;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextField tx_escreva;
private javax.swing.JTextField tx_nome;
private javax.swing.JTextField tx_porta;
private javax.swing.JTextArea tx_resultado;
// End of variables declaration
}