O JFrame do Cliente fica travado, não consigo acessá-lo. Só consigo destravar a tela do Cliente quando o JFrame do Servidor é fechado…
Porque acontece isso?
Servidor:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class Servidor implements ActionListener, KeyListener {
private JFrame janela = new JFrame("Servidor");
private String nome;
private JPanel conversaPanel = new JPanel();
private JPanel mensagemPanel = new JPanel();
private JTextArea conversaTextArea = new JTextArea(41, 75);
private JScrollPane conversaScrollPane = new JScrollPane(conversaTextArea);
private JTextField mensagemTextField = new JTextField(70);
private JButton mensagemButton = new JButton("Enviar Mensagem");
// Rede.
private ServerSocket serverSocket = null;
private Socket socket = null;
private BufferedReader entrada;
private PrintStream saida;
/** Creates a new instance of Servidor */
public Servidor(String nome) {
this.nome = nome;
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
conversaPanel.add(conversaScrollPane);
mensagemPanel.add(mensagemTextField);
mensagemPanel.add(mensagemButton);
janela.add(conversaPanel, BorderLayout.WEST);
janela.add(mensagemPanel, BorderLayout.SOUTH);
janela.setExtendedState(JFrame.MAXIMIZED_BOTH);
janela.setVisible(true);
// Listeners.
mensagemButton.addActionListener(this);
mensagemTextField.addKeyListener(this);
try {
serverSocket = new ServerSocket(1000);
socket = serverSocket.accept();
entrada = new BufferedReader(new InputStreamReader(socket.getInputStream()));
saida = new PrintStream(socket.getOutputStream());
while(true) {
String s = entrada.readLine();
if(! s.trim().equals(""))
conversaTextArea.setText(conversaTextArea.getText() + "\n" + s);
}
}
catch(IOException ioe) {
System.out.println(ioe);
}
}
public void keyPressed(KeyEvent ke) {
if(ke.getKeyCode() == KeyEvent.VK_ENTER && ! mensagemTextField.getText().trim().equals("")) {
conversaTextArea.setText(conversaTextArea.getText() + "\n" + nome + " : " + mensagemTextField.getText());
saida.println(nome + " : " + mensagemTextField.getText());
mensagemTextField.setText("");
}
}
public void actionPerformed(ActionEvent ae) {
Object objeto = ae.getSource();
if(objeto == mensagemButton && ! mensagemTextField.getText().trim().equals("")) {
conversaTextArea.setText(conversaTextArea.getText() + "\n" + nome + " digitou: " + mensagemTextField.getText());
saida.println(nome + " : " + mensagemTextField.getText());
mensagemTextField.setText("");
}
}
public static void main(String[] args) {
Servidor s = new Servidor("Servidor");
}
}
Cliente. Uma tela de login pede o IP do Servidor e o apelido do usuário. Com esses dois argumentos é criado o objeto Cliente.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class Cliente implements ActionListener, KeyListener {
private JFrame janela = new JFrame("Cliente");
private JPanel conversaPanel = new JPanel();
private JPanel mensagemPanel = new JPanel();
private JTextArea conversaTextArea = new JTextArea(41, 75);
private JScrollPane conversaScrollPane = new JScrollPane(conversaTextArea);
private JTextField mensagemTextField = new JTextField(70);
private JButton mensagemButton = new JButton("Enviar Mensagem");
// Rede.
private Socket socket = null;
private BufferedReader entrada;
private PrintStream saida;
private String nome;
private String ip;
/** Creates a new instance of Cliente */
public Cliente(String ip, String nome) {
this.nome = nome;
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
janela.setLayout(new FlowLayout());
conversaPanel.add(conversaScrollPane);
mensagemPanel.add(mensagemTextField);
mensagemPanel.add(mensagemButton);
janela.add(conversaPanel, BorderLayout.WEST);
janela.add(mensagemPanel, BorderLayout.SOUTH);
janela.setExtendedState(JFrame.MAXIMIZED_BOTH);
janela.setVisible(true);
// Listeners.
mensagemButton.addActionListener(this);
mensagemTextField.addKeyListener(this);
try {
socket = new Socket(ip, 1000);
entrada = new BufferedReader(new InputStreamReader(socket.getInputStream()));
saida = new PrintStream(socket.getOutputStream());
while(true) {
String s = entrada.readLine();
if(! s.trim().equals(""))
conversaTextArea.setText(conversaTextArea.getText() + "\n" + s);
}
}
catch(IOException ioe) {
System.out.println(ioe);
}
}
public void keyPressed(KeyEvent ke) {
if(ke.getKeyCode() == KeyEvent.VK_ENTER && ! mensagemTextField.getText().trim().equals("")) {
conversaTextArea.setText(conversaTextArea.getText() + "\n" + nome + " : " + mensagemTextField.getText());
saida.println(nome + " : " + mensagemTextField.getText());
mensagemTextField.setText("");
}
}
public void actionPerformed(ActionEvent ae) {
Object objeto = ae.getSource();
if(objeto == mensagemButton && ! mensagemTextField.getText().trim().equals("")) {
conversaTextArea.setText(conversaTextArea.getText() + "\n" + nome + " digitou: " + mensagemTextField.getText());
saida.println(nome + " : " + mensagemTextField.getText());
mensagemTextField.setText("");
}
}
}
Qualquer ajuda, será bem vinda.