Problema al crear un Servidor en Java

i02hajij
24 de Febrero del 2006
Hola a todos. Estoy haciendo un servidor con swing. Para ello creo un JPanel que contiene simplemente un JButton y un JTextArea.

Con el botón se inicializa el servidor, que va mostrando la información en el JTextArea mediante la funcion escribir:

<b>
public void escribir (String mensaje )
{
String texto = txtSucesos.getText();
texto += mensaje;

txtSucesos.setText(texto);
}
</b>

La función que genera el servidor es:

<b>
public void iniciarServidor( int puerto )
{
escribir("Intentando arrancar el servidor en el puerto " + puerto + "n");

try
{
server = new ServerSocket(puerto);
escribir("Servidor creado en puerto " + puerto + "n");
escribir("Esperando peticiones...n");
/*while (true)
{

Socket sock = server.accept();
//Cliente cliente = new Cliente(this, sock);
//clientes.addElement(cliente);
}*/
} catch (IOException e)
{
escribir("Error al generar el servidorn");
terminarServidor();
}
}
</b>

El problema que tengo es que si le dejo el while(true) para escuchar peticiones, se me queda colgado, ni siquiera llega a escribir los mensajes en el JTextArea. Sin embargo, si quito el while (true), sí me muestra los dos primeros mensajes ("Servidor creado..." y "Esperando peticiones").

Se me había ocurrido averiguar si existe alguna forma de hacer que cada vez que se conecte un cliente se lance un evento, para así evitar tener que hacer el bucle, pero no se como hacerlo.

¿Alguien me puede decir como puedo solucionar este problema? Llevo ya un día con esto y no consigo solucionarlo. Se los agradecería mucho.

chuidiang
24 de Febrero del 2006
Hola:

La llamada a accept() se queda bloqueada hasta que se conecte un cliente. Si la pones dentro del while, sólo hará una vuelta por cada cliente que se conecte.

Las llamadas a los read() de los clientes también se quedan bloqueadas hasta que llegue algo.

Una forma de solucionar este problema es usar hilos. Hazte una clase que implemente la interface Runnable y que reciba las conexiones de los clientes. En el método run() de esta clase pon un bucle infinito para atender al cliente. Algo asi

class AtiendeCliente implements Runnable
{
public AtiendeCliente (Cliente c, JTextArea t)
{
// guardas c y t en atributos de esta clase
}
public void run ()
{
while (true)
{
Mensaje = read(); // read del socket cliente
texarea.apend (mensaje) // Sacarlo por pantalla.
}
}
}

Luego en tu main, haces otro bucle infinito para los accept, pero cada vez que se conecte un cliente, hacex un nuevo hilo con un nuevo AtiendeCliente

while (true)
{
Cliente c = Servidor.accept();
Thread hilo = new Trhead (new AtiendeCliente (c, textArea));
hilo.start();
}

Bueno, es más o menos la idea y no me he liado a ponerte bien todas las variables en el "código", pero espero que se entienda la idea.

Se bueno.