elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Mantener conexión abierta en servidor - conexión cliente servidor
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Mantener conexión abierta en servidor - conexión cliente servidor  (Leído 2,385 veces)
cesarobcn

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Mantener conexión abierta en servidor - conexión cliente servidor
« en: 26 Octubre 2013, 13:33 pm »

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!! :huh:


***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); // conexión 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());
        }
    }
}


En línea

egyware


Desconectado Desconectado

Mensajes: 526



Ver Perfil WWW
Re: Mantener conexión abierta en servidor - conexión cliente servidor
« Respuesta #1 en: 29 Octubre 2013, 19:13 pm »

Está mal planteado el código de tu servidor
Código
  1. package servidor;
  2. import java.io.*;
  3. import java.net.*;
  4. import java.util.GregorianCalendar;
  5. /*
  6.  * @author Cesar
  7.  */
  8. public class Servidor
  9. {
  10.    private static int PUERTO=5000;
  11.  
  12.    public static void main(String[] args)
  13.    {
  14.        String horaSistema, op="";
  15. int hora, minuto, segundo, cliente=0;
  16. boolean infinito = true, skCl=true;
  17.  
  18.        try
  19.        {
  20.            ServerSocket skServidor = new ServerSocket(PUERTO); // conexión hecha con el cliente.
  21.            System.out.println("Escuchando al Puerto "+PUERTO+" Esperando..");
  22.  
  23.            Socket skCliente = skServidor.accept();                         // aqui el prog. se detiene y espera(escucha) al prox cliente
  24.            ++cliente;
  25.            while(infinito)
  26.            {
  27.                //recibo e imprimo en pantalla el msje q recibo de 'Cliente' en
  28.                //infoEntrada -> informac. que entra - ingresa al servidor
  29.                InputStream auxIn = skCliente.getInputStream();
  30.                DataInputStream infoEntrada = new DataInputStream(auxIn); // se crea el objeto infoEntrada
  31.                op=infoEntrada.readUTF(); //recibe el texto: “HORA” “MINUTO” “SEGUNDO” “HORAMINUTO” “HORAMINUTOSEGUNDO”
  32.  
  33.                System.out.println("El Cliente numero "+Integer.toString(cliente)+" me esta solicitando.."+op);
  34.  
  35.                GregorianCalendar datoTime = new GregorianCalendar();
  36.                hora = datoTime.get(GregorianCalendar.HOUR_OF_DAY);
  37.                minuto = datoTime.get(GregorianCalendar.MINUTE);
  38.                segundo = datoTime.get(GregorianCalendar.SECOND);
  39.                //--------------------------------------------------------------
  40.                //Aqui validar el parametro que se recibe desde el cliente.
  41.                switch(op)
  42.                {
  43.                    case "HORA":
  44.                            op = "La hora actual es : "+hora;
  45.                            break;
  46.                    case "MINUTO":
  47.                            op = "El minuto actual es : "+minuto;
  48.                            break;
  49.                    case "SEGUNDO":
  50.                            op = "el segundo actual es : "+segundo;
  51.                            break;
  52.                    case "HORAMINUTO":
  53.                            op = "La hora y el minuto actual es : "+hora+" : "+minuto;
  54.                            break;
  55.                    case "HORAMINUTOSEGUNDO":
  56.                            op = "La hora el minuto y el segundo actual es : "+hora+" : "+minuto+" : "+segundo;
  57.                            break;
  58.                    case "salir" :
  59.                            op = "saliendo";
  60.                            break;
  61.                    case "SALIR" :
  62.                            op = "saliendo";
  63.                            break;
  64.                    default :
  65.                            op = "Opcion incorrecta";
  66.                            break;
  67.                }
  68.                //envia RESPUESTA al cliente
  69.                //infoSalida -> informac. que sale fuera del servidor
  70.                OutputStream auxOut = skCliente.getOutputStream();
  71.                DataOutputStream infoSalida = new DataOutputStream(auxOut);     // se crea el objeto infoSalida
  72.                infoSalida.writeUTF(op);
  73.                //--------------------------------------------------------------
  74.             }
  75.             skCliente.close();  /// **** AQUI ESTA EL TEMA ..ESTO CIERRA LA CONECC AL CLIENTE
  76.  
  77.        }
  78.        catch (Exception e)
  79.        {
  80.            System.out.println(e.getMessage());
  81.        }
  82.    }
  83. }

Interpreta con tu cerebro el flujo de tu programa.

Si no lo captas mira esta linea
Código
  1.  Socket skCliente = skServidor.accept();                         // aqui el prog. se detiene y espera(escucha) al prox cliente
Está rodeada de un try/catch no tiene ningún bucle o ciclo que indique que se repita.

Una arquitectura para manejar los nuevos clientes en los servidores seria algo así.

Código:
while(infinito)
    socket nuevo = accept()
    iniciar_un_nuevo_thread(nuevo)
endwhile
En resumen: Cada vez que un nuevo cliente se conecte, se creará un nuevo Thread por cada cliente. En cada Thread tu deberías colocar el codigo que tienes en el while (en el tuyo).


Espero que hayas entendido.
Saludos!


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
CLIENTE-SERVIDOR EN VB.NET ¿?
Programación Visual Basic
Lord Vader 3 2,645 Último mensaje 1 Septiembre 2005, 19:42 pm
por Lord Vader
cliente/servidor en vb.net¿?¿?¿?
.NET (C#, VB.NET, ASP)
WarGhost 5 6,777 Último mensaje 17 Junio 2006, 19:22 pm
por BADBYTE-K
App Cliente/Servidor.
Programación Visual Basic
1 1,807 Último mensaje 17 Junio 2006, 17:13 pm
por Cicklow
Como mantener aplicacion en Memoria en Servidor LINUX?
Programación General
Skeletron 2 2,650 Último mensaje 14 Julio 2010, 21:17 pm
por Debci
conexión abierta a Internet a través de un móvil a otro estando desde una wifi
Redes
DK0 1 2,993 Último mensaje 24 Septiembre 2013, 19:09 pm
por adrianmendezRap
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines