Les traigo un problemita que estoy teniendo y no encuentro forma de resolverlo!.
Tengo una aplicación sencilla de estilo múltiples clientes – un solo servidor. La idea es que el servidor cree un hilo por cada cliente que llega (hasta esta parte funciona perfecto) como funcionaba en consola quise agregarle una GUI sencilla que por medio de un botón inicie un hilo para el servidor.
El inconveniente esta justo cuando presiono el botón “iniciar” todo queda clavado (creo yo que queda en el hilo servidor esperando por clientes) y la GUI deja de responder.
Espero que me puedan ayudar. Les dejo el codigo:
VistaPrincipal:
Código:
public class VistaPrincipal extends JFrame {
private JPanel contentPane;
private Runnable server = null;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
VistaPrincipal frame = new VistaPrincipal();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public VistaPrincipal() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 497, 310);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblClientes = new JLabel("Clientes: ");
lblClientes.setBounds(10, 11, 77, 14);
contentPane.add(lblClientes);
JList<String> listaCLientes = new JList<String>();
JList<String> listaLog = new JList<String>();
JPanel panelClientes = new JPanel();
panelClientes.setBounds(10, 29, 110, 202);
contentPane.add(panelClientes);
panelClientes.setLayout(null);
JScrollPane scrollClientes = new JScrollPane(listaCLientes);
scrollClientes.setBounds(0, 0, 110, 202);
panelClientes.add(scrollClientes);
JPanel panelLog = new JPanel();
panelLog.setBounds(130, 29, 341, 202);
contentPane.add(panelLog);
panelLog.setLayout(null);
JScrollPane scrollLog = new JScrollPane(listaLog);
scrollLog.setBounds(0, 0, 341, 232);
panelLog.add(scrollLog);
JButton btnSalir = new JButton("Salir");
btnSalir.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
dispose();
}
});
btnSalir.setBounds(382, 242, 89, 23);
contentPane.add(btnSalir);
JButton btnIniciar = new JButton("Iniciar");
btnIniciar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
server = new Servidor();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "Error al crear el servidor, cierre la maquina virtual de java e intentelo nuevamente", "Error!", JOptionPane.ERROR_MESSAGE);
}
if (server != null) {
Thread hilo = new Thread(server);
hilo.run();
}
}
});
btnIniciar.setBounds(20, 242, 89, 23);
contentPane.add(btnIniciar);
JButton btnStop = new JButton("Stop");
btnStop.setBounds(119, 242, 89, 23);
contentPane.add(btnStop);
//FIN CREACION DE VISTA
}
}
Servidor.java:
Código:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
public class Servidor implements Runnable {
private int puerto = 20000;
private ServerSocket socket;
public Servidor() throws IOException {
this.socket = new ServerSocket(this.puerto);
}
public void run() {
while (true) {
Socket cliente = null;
try {
cliente = socket.accept();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "Error al aceptar nuevo Cliente", "Error!", JOptionPane.ERROR_MESSAGE);
}
if (cliente != null) {
Runnable nuevoCliente = new HiloCliente(cliente);
Thread hilo = new Thread(nuevoCliente);
hilo.run();
}
}
}
}
HiloCliente.java:
Código:
import java.net.Socket;
public class HiloCliente implements Runnable {
private Socket socket;
public HiloCliente (Socket socket) {
this.socket = socket;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Cliente");
}
}
P.D: como hago para que el codigo se vea con color?