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

[SOLUCIONADO] Mantener coneccion abierta en servidor - coneccion cliente servidor

Estas en el tema de Mantener coneccion abierta en servidor - coneccion cliente servidor en el foro de Java en Foros del Web. Hola a todos! ,he logrado establecer conexión entre el cliente y el servidor, el cliente le solicita al servidor la hora, minutos, etc. y el ...
  #1 (permalink)  
Antiguo 25/10/2013, 14:44
 
Fecha de Ingreso: julio-2008
Mensajes: 11
Antigüedad: 15 años, 8 meses
Puntos: 0
Mantener coneccion abierta en servidor - coneccion cliente servidor

Hola a todos! ,he logrado establecer conexión entre el cliente y el servidor, el cliente le solicita al servidor la hora, minutos, etc. y el servidor devuelve esa info, en cliente tengo un bucle hasta que le digo 'salir', entonces la conexión (socket) del cliente se cierra, pero lo curioso es que el servidor tambien cierra sesion.
La idea es que el servidor SIEMPRE este 'esperando' nuevas peticiones, ya que podria ejecutar otra vez 'cliente' y el servidor deberia estar conectado..tengo un bucle infinito en el servidor.. pero tendria que tener otro bucle que me controle que el cliente cerro su sesion (socket.close()) pero que no cierre el servidor, les dejo el codigo.. echarle un vistazo porfi.. gracias!!


**CLIENTE
Código:
package cliente;

import java.io.*;
import java.net.*;
/**
 * @author Cesar
 */
public class Cliente {
    /**
     * @param args the command line arguments
     */
    static final String HOST ="localhost";
    static final int PUERTO=5000;
    
    public static void main(String[] args) 
    {
	String pedirDato;
	boolean infinitoC = true;
        
        InputStreamReader entrada = new InputStreamReader(System.in);
        BufferedReader teclado = new BufferedReader(entrada);
        try
        {
            Socket skCliente = new Socket(HOST, PUERTO);
            while(infinitoC)
            {
                // Pedir dato que se enviara al servidor
                System.out.print("Ingrese [HORA-MINUTO-SEGUNDO-HORAMINUTO-HORAMINUTOSEGUNDO] : ");
                pedirDato = teclado.readLine();
                if("SALIR".equals(pedirDato) || "salir".equals(pedirDato))
                {
                    infinitoC=false;
                    pedirDato="salir";
                }
                else
                {
                    //infoSalida -> informac. que sale del cliente ..va al servidor
                    OutputStream auxOut = skCliente.getOutputStream();
                    DataOutputStream infoSalida = new DataOutputStream(auxOut);
                    infoSalida.writeUTF(pedirDato);   // enviamos al Servidor el parametro recibido por consola

                    //recibo e imprimo en pantalla el msje q me envia el 'Servidor' en 
                    //infoEntrada -> informac. que ingresa al cliente
                    InputStream auxIn = skCliente.getInputStream();
                    DataInputStream infoEntrada = new DataInputStream(auxIn);
                    System.out.println("El servidor dice : "+infoEntrada.readUTF());
                }
            }
            skCliente.close();
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
    
}

**SERVIDOR
Código:
package servidor;
import java.io.*;
import java.net.*;
import java.util.GregorianCalendar;
/*
 * @author Cesar 
 */
public class Servidor 
{
    private static int PUERTO=5000;
    
    public static void main(String[] args) 
    {
        String horaSistema, op="";
	int hora, minuto, segundo, cliente=0;
	boolean infinito = true, skCl=true;
			
        try
        {
            ServerSocket skServidor = new ServerSocket(PUERTO);			// coneccion hecha con el cliente.
            System.out.println("Escuchando al Puerto "+PUERTO+" Esperando..");

            Socket skCliente = skServidor.accept();                         // aqui el prog. se detiene y espera(escucha) al prox cliente
            ++cliente;
            while(infinito)
            {	
                //recibo e imprimo en pantalla el msje q recibo de 'Cliente' en 
                //infoEntrada -> informac. que entra - ingresa al servidor
                InputStream auxIn = skCliente.getInputStream();
                DataInputStream infoEntrada = new DataInputStream(auxIn);	// se crea el objeto infoEntrada
                op=infoEntrada.readUTF();					//recibe el texto: “HORA” “MINUTO” “SEGUNDO” “HORAMINUTO” “HORAMINUTOSEGUNDO”

                System.out.println("El Cliente numero "+Integer.toString(cliente)+" me esta solicitando.."+op);
                
                GregorianCalendar datoTime = new GregorianCalendar();
                hora = datoTime.get(GregorianCalendar.HOUR_OF_DAY);
                minuto = datoTime.get(GregorianCalendar.MINUTE);
                segundo = datoTime.get(GregorianCalendar.SECOND);
                //--------------------------------------------------------------
                //Aqui validar el parametro que se recibe desde el cliente.
                switch(op)
                {
                    case "HORA":
                            op = "La hora actual es : "+hora;
                            break;
                    case "MINUTO":
                            op = "El minuto actual es : "+minuto;
                            break;
                    case "SEGUNDO":
                            op = "el segundo actual es : "+segundo;
                            break;
                    case "HORAMINUTO":
                            op = "La hora y el minuto actual es : "+hora+" : "+minuto;
                            break;
                    case "HORAMINUTOSEGUNDO":
                            op = "La hora el minuto y el segundo actual es : "+hora+" : "+minuto+" : "+segundo;
                            break;
                    case "salir" :
                            op = "saliendo";
                            break;
                    case "SALIR" :
                            op = "saliendo";
                            break;
                    default :
                            op = "Opcion incorrecta";
                            break;	
                }
                //envia RESPUESTA al cliente
                //infoSalida -> informac. que sale fuera del servidor
                OutputStream auxOut = skCliente.getOutputStream();			
                DataOutputStream infoSalida = new DataOutputStream(auxOut);     // se crea el objeto infoSalida
                infoSalida.writeUTF(op);
                //--------------------------------------------------------------
             }
             skCliente.close();  /// **** AQUI ESTA EL TEMA ..ESTO CIERRA LA CONECC AL CLIENTE
                        
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
}
Gracias!!

Última edición por cesarobcn; 25/10/2013 a las 14:53
  #2 (permalink)  
Antiguo 25/10/2013, 19:47
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 1 mes
Puntos: 260
Sonrisa Respuesta: Mantener coneccion abierta en servidor - coneccion cliente servidor

Hola,

Cuando el cliente cierra la conexión el servidor todavía está esperando datos en readUTF, al cerrarse una conexión y estar en una lectura síncrona, el método readUTF tira una Exception y llega al catch.

Por lo tanto no llega al close, simplemente salta del readUTF() al catch, deberías observar la pantalla del servidor y ver lo que muestra en System.out. Seguramente muestra algo como connection lost, etc.

Adicionalmente, tu programa solo puede atender a un cliente al mismo tiempo, puesto que mientras está contestando dentro del ciclo infinito no puede aceptar mas conexiones. Para eso se usan hilos y sincronización.

Saludos,
  #3 (permalink)  
Antiguo 26/10/2013, 00:42
 
Fecha de Ingreso: julio-2008
Mensajes: 11
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Mantener coneccion abierta en servidor - coneccion cliente servidor

Hola HackmanC gracias por responder, efectivamente cuando el servidor 've' que el cliente ha cerrado su sesion salta al catch y en consola simplemente me sale un 'null' y justo debajo se muestra su desconexión, eso es lo que quiero controlar y no se por donde pillarlo, estoy empezando a tocar java y no me aclaro muy bien, por otro lado es verdad q solo acepta a un cliente a la vez, de momento no importa, lo que importa es que el servidor continue activo para que pueda servir al cliente 2,3,4 etc. uno a uno. ..haber si algun crack me echa un cable

gracias!!
  #4 (permalink)  
Antiguo 26/10/2013, 10:54
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 1 mes
Puntos: 260
Sonrisa Respuesta: Mantener coneccion abierta en servidor - coneccion cliente servidor

Hola,

Cita:
Iniciado por cesarobcn Ver Mensaje
Hola HackmanC gracias por responder, efectivamente cuando el servidor 've' que el cliente ha cerrado su sesion salta al catch y en consola simplemente me sale un 'null' y justo debajo se muestra su desconexión, eso es lo que quiero controlar y no se por donde pillarlo, ...
Parece que no te enteras de lo que escribí, si el problema es el catch y el ciclo infinito, simplemente tienes que modificar el algoritmo de la siguiente forma, para que el catch quede dentro del ciclo infinito:

Código Java:
Ver original
  1. while (true) {
  2.   Socket cliente = server.accept();
  3.   try {
  4.     x = readUTF();
  5.     if (x == ALGO) {
  6.        algo();
  7.     }
  8.     cliente.close()
  9.   } catch (Exception e) {
  10.   }
  11. }

Podrías agregar un cliclo adicional para contestar varias peticiones del mismo cliente en la misma conexión, que al parecer es lo que querías:

Código Java:
Ver original
  1. while (true) {
  2.   Socket cliente = server.accept();
  3.   try {
  4.     while (true) {
  5.         x = readUTF();
  6.         if (x == ALGO) {
  7.            algo();
  8.         }
  9.         if (x == END) {
  10.            break;
  11.         }
  12.     }
  13.     cliente.close()
  14.   } catch (Exception e) {
  15.   }
  16. }
Pero aún así tu programa solamente puede mantener una conexión con un cliente a la vez, no puede manejar dos clientes al mismo tiempo, para eso necesitas hilos (threads) y sincronización (synchronized).

Saludos,
  #5 (permalink)  
Antiguo 26/10/2013, 14:05
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 5 meses
Puntos: 454
Respuesta: Mantener coneccion abierta en servidor - coneccion cliente servidor

Hola:

Aquí http://www.chuidiang.com/java/socket...cket_hilos.php tienes un ejemplo de cómo hacer un servidor que pueda atender, con hilos, a varios clientes simultáneamente.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #6 (permalink)  
Antiguo 29/10/2013, 10:44
 
Fecha de Ingreso: julio-2008
Mensajes: 11
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Mantener coneccion abierta en servidor - coneccion cliente servidor

Gracias por vuestra ayuda.. lo pude solucionar, habia que enviar un 'dato' desde el cliente hacia el servidor 'diciendole' que termina su sesion este dato lo recibe dentro del buche infinito, dentro de otro bucle a la vez, asi si un cliente termina sesion, el servidor espera a otro cliente gracias!

Etiquetas: abierta, cliente, coneccion, servidor, string
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 07:38.