Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] socket cuelga el programa

Estas en el tema de socket cuelga el programa en el foro de Java en Foros del Web. Tengo un programa servidor de servidores con un serversocket. A este programa servidor se le pueden conectar 2 tipos de programas. 1.- Un programa cliente, ...
  #1 (permalink)  
Antiguo 29/09/2015, 12:30
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 11 años, 6 meses
Puntos: 31
socket cuelga el programa

Tengo un programa servidor de servidores con un serversocket.

A este programa servidor se le pueden conectar 2 tipos de programas.
1.- Un programa cliente, que recibe la dirección de servidor de servicios.
2.- Un programa servidor de servicios, que se registra como disponible para que el programa cliente reciba su dirección para que se le conecte a él.

Cuando un programa cliente se conecta sin que haya conectado previamente un programa servidor de servicios el programa cliente conecta sin ningún problema, recibe el mensaje de que no hay proveedores de servicios y hace sus cosas sin problemas.

Sin embargo, cuando el programa servidor de servicios intenta abrir un socket, ya sea antes o después que el cliente... se queda colgado. Y el código de conexión es exactamente el mismo que el que usa el cliente. Abre un socket con una dirección y un puerto. Los 2, tanto el cliente como el proveedor de servicios abren el socket de la misma manera.

Además, el proveedor de servicios, en el momento de quedarse colgado, aún no ha abierto un ServerSocket para que se le conecte un cliente. En el momento de colgarse los 2 programas, el cliente y el proveedor de servicios han ejecutado exactamente las mismas cosas. Sin embargo... el programa servidor de servicios se queda colgado en la línea de declaración del nuevo socket
Código:
private Socket conexion;
public boolean isConectado(){
		try {
			conexion=new Socket(IP,puerto);
(...)etc
Lo curioso es que antes de que me empezase esto a fallar, me estaba conectando bien. Tanto el servidor de servicios como el cliente. Y tocando y modificando cosillas sobre la gestión de la información una vez llegase a cada programa (mostrarla en una tabla, sacar la info de la tabla para mandarla, etc) de pronto empezó a fallarme y ya no he conseguido que me funcione más. Se queda colgado y no pasa de ahí.

Última edición por Kritik; 29/09/2015 a las 12:36
  #2 (permalink)  
Antiguo 29/09/2015, 12:48
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años
Puntos: 454
Respuesta: socket cuelga el programa

Hola:

Esta línea

conexion=new Socket(IP,puerto);

abre un socket cliente que intenta conectarse a un servidor que está en la IP y escuchando en el puerto. Una posiblidad para que esa llamada se quede colgada es que hay un servidor escuchando en esa IP y puerto (serverSocket = new ServerSocket()), pero no hace un accept() de la conexión (serverSocket.accept()), el cliente (tu código) se quedará colgado en espera de ese accept()

Un posible motivo de que te suceda esto es que estás haciendo dos clientes (uno en el servidor de servicios y otro en el cliente, con esa llamada new Socket(IP,puerto), así que tienes que asegurarte que tu servidor (ServerSocket) es capaz de atender a varios clientes, es decir, hace varios accept(). Suele ser un error habitual hacer el accept() y liarse con mensajes del cliente, olvidándose de lanzar un hilo o algo que sea capaz de hacer un segundo accept() si un segundo cliente intenta conectarse.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 29/09/2015, 13:45
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 11 años, 6 meses
Puntos: 31
Respuesta: socket cuelga el programa

El acept() ya lo tuve en cuenta, no está ahí el problema. Mi serversocket acepta de manera automática las conexiones, además tengo un máximo de 50 conexiones así que tampoco es por huecos en el serversocket.

He estado intentando aislar más aún el momento exacto del cuelgue. Y por ahora lo puedo definir aquí:

Mi servidor de servicios conecta con mi servidor de servidores. Informa de que está disponible, recibe confirmación ("Servidor Registrado") y cierra ese socket, así como los objetos de lectura y escritura. Lo cierro todo. y aunque el objeto conexión sigue estando en el programa, el socket que tiene ese objeto está cerrado.

Luego hago una condición, de que si el texto que había recibido antes (y que guardé en variable) es "Servidor Registrado" entonces me creo un objeto serversocket. Exactamente el mismo objeto que está en mi servidor de servidores, pero en distinto puerto. Y entonces... CRASH!! Se queda colgado ahí.

Este es mi código:

Código:
void lanzarServidor(){
	ServerClients.txtLogs.setText(ServerClients.txtLogs.getText() + "\nArrancando Servidor.");
	JOptionPane.showMessageDialog(null,"Aceptar");
	try {
		s=new ServerSocket(50007,20); // conexión por el puerto 50007 y
						// máximo de 20 clientes conectados
		JOptionPane.showMessageDialog(null,"Aceptar2");
		while (true){
			JOptionPane.showMessageDialog(null,"Aceptar3");
			new ClienteServidor(s.accept(),this,cliente++).start();
			JOptionPane.showMessageDialog(null,"Aceptar4");
		}
	} catch (IOException ioe) {
		ServerClients.txtLogs.setText(ServerClients.txtLogs.getText() + "\nError al lanzar el servidor. " + ioe.getMessage());
	}
}
}
Y este es el constructor, junto con su primera línea
Código:
ClienteServidor(Socket c,ConexionDeCliente s,int numero){
		JOptionPane.showMessageDialog(null,"Aceptar 5");
Llego a ver los avisos "Aceptar","Aceptar2" y "Aceptar3".
El mensaje "Aceptar 4" y el de "Aceptar 5" no llego a verlos ninguno.

Por cierto, tampoco es que me suelte ningún error de ningún tipo.

Y como digo, el servidor de servidores tiene exactamente el mismo código, pero en otro puerto. Lo único que cambia es el nº del puerto. Y el servidor de servidores funciona perfectamente.

Última edición por Kritik; 29/09/2015 a las 14:22
  #4 (permalink)  
Antiguo 29/09/2015, 14:51
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años
Puntos: 454
Respuesta: socket cuelga el programa

Hola:

Esta llamada

new ClienteServidor(s.accept(),this,cliente++).start() ;

se queda bloqueada hasta que un cliente se conecte, por el s.accept(). ¿Hay algún cliente conectándose ahí cuando llegas a esa línea de código?

De todas formas, ¿en el primer post se te quedaba colgado en una línea y ahora en otra que aparentemente no tiene nada que ver?. Quizás hay más de un problema por ahí....

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 29/09/2015, 19:09
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 11 años, 6 meses
Puntos: 31
Respuesta: socket cuelga el programa

Tienes razón. Se queda ahi a la espera de un cliente. De ahi que no llegue a mi constructor hasta que no haya un cliente que conecte.

Sin embargo a mi servidor de servidores le pasa lo mismo cuando arranca y no se queda colgado. Quiero decir que los menus siguen funcionando y los botones de la barra superior igual. En este caso ni el botón de la X funciona.

Por otro lado es cierto lo que dices, pero no se si ha sido por reiniciar el Windows, por haber tocado un poco el codigo aunque no he cambiado apenas nada o porque antes no llegaba a aislamiento exacto de la línea donde se detenía. Pero el caso es que ahora se queda ahí.
  #6 (permalink)  
Antiguo 30/09/2015, 00:56
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años
Puntos: 454
Respuesta: socket cuelga el programa

Hola:

En java todo el tema de ventanas y botones va en un hilo separado que se llama EDT (Event Dispatch Thread). Ese hilo es distinto del hilo principal del main de la aplicación.

Si tu main crea ventanas y luego se queda bloqueado en espera de algo, las ventanas van a funcionar porque están en un hilo separado.

Si como consecuencia de la pulsación de un botón, teclado, o cualquier evento relativo a ventanas haces código que se quede bloqueado, ese código se está ejecutando en el hilo de ventanas EDT, puesto que viene de un evento de una ventana, y se quedan todas bloqueadas.

Más info aquí http://chuwiki.chuidiang.org/index.p...hread)_de_Java

En general, suele ser buena idea hacer que las llamadas que se puedan quedar bloqueadas (accept() y read() de sockets), se ejecuten en un hilo separado sólo para ellas.

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Última edición por chuidiang; 30/09/2015 a las 01:03
  #7 (permalink)  
Antiguo 30/09/2015, 01:09
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 11 años, 6 meses
Puntos: 31
Respuesta: socket cuelga el programa

Aquí ahora son las 9 de la mañana... y ya me puedo acostar, sabiendo una cosa más. Jijijijiji

Etiquetas: cuelga, programa, socket
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:25.