Imagen de Rubén Casillas Luengo
Problema al liberar un puerto usado por un ServerSocket
de Rubén Casillas Luengo - lunes, 17 de septiembre de 2007, 13:54
 

Hola, tengo un pequeño problema con el tema de los puertos a la hora de liberarlos. Estoy probando la practica en Windows XP.

Cada vez que registro un usuario nuevo, creo su correspondiende ServidorP2P, el cual crea a su vez su ServerSocket para poder aceptar los mensajes a través de la red y éste evidentemente se ata a un puerto.

Pues bien, cuando doy de baja ese usuario, en el ServidorP2P realizo el correspondiente server.close(), el cual he supuesto que se encarga entre otras cosas de liberar el puerto al que estaba atado el ServerSocket. Pero he debido suponer mal, o me debe de faltar añadir algo más, ya que cuando posteriormente vuelvo a registrar ese mismo usuario, usando el mismo puerto, salta una excepción que me dice que ese puerto ya está en uso y no se ha podido instanciar el ServerSocket.

Me estoy dejando algo por ahí, es normal que esto pase, debería evitar eso de alguna manera para que la práctica se considere correcta??

Gracias por las respuestas ;-)

P.D.: Me ocurre lo mismo cada vez que "rearranco" un terminal usando el puerto con el que lo habia lanzado anteriormente, pero ahí lo veo algo más normal, ya que no se para su ejecución de una manera limpia, realizando su "socket.close()" como en el caso del ServidorP2P

Imagen de E F
Re: Problema al liberar un puerto usado por un ServerSocket
de E F - lunes, 17 de septiembre de 2007, 15:06
 
Hola,

Utiliza interrupt que viene especificado en la hoja 2 de la fase II de la documentacion relativa a las practicas que ha dado el profesor, que te proporciona una terminación limpia del serverSocket.

Saludos
Imagen de Rubén Casillas Luengo
Re: Problema al liberar un puerto usado por un ServerSocket
de Rubén Casillas Luengo - lunes, 17 de septiembre de 2007, 15:51
 

Si no me equivoco, eso es para que el thread del ServidorP2P termine de una manera limpia, no para que el socket se desate del puerto, de hecho lo estaba usando tambien. Cuando el thread recibe el interrupt, sale del bucle de recepción de peticiones, y realiza el server.close(), que es el que debería de liberar el puerto, pero aparentemente no lo hace, como expliqué anteriormente.

Gracias de todas formas ;)

Imagen de Nacho Cuesta
Re: Problema al liberar un puerto usado por un ServerSocket
de Nacho Cuesta - lunes, 17 de septiembre de 2007, 19:09
 
Hola, yo acabo de tener el mismo problema. Para solucionarlo simplemente he cambiado el nombre del metodo con el que arranco el ServidorP2P de run() a start().

Antiguamente lo tenia como run() y todo funcionaba a la perfección pero al invocar el metodo interrupt() con el cual se debia salir del bucle que acepta las peticiones esto no sucedia y seguia aceptandolas, con la consecuencia de que nunca se ejecutaba el server.close() que va a continuacion de ese bucle. Lo he cambiado a start() y al llamar a interrupt() ya me sale del bucle y todo va perfecto.

Saludos.
Imagen de Inspector Fucker
Re: Problema al liberar un puerto usado por un ServerSocket
de Inspector Fucker - martes, 18 de septiembre de 2007, 10:02
 

Efectivamente, nach. Eso sucede porque al llamar al metodo start de thread, el mismo comienza su ejecución en el método run. Es decir se ejcuta el thread como tal. Pero si directamente llamas al método run, es como si llamaras al método de una clase, lo cual me parece que no tiene el comportamiento correcto. A mi, por ejemplo, sencillamente no me creaba el thread, seguia ejecutándose el flujo de control en el mismo thread.

Nach, nach scrach!