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

Sockets en java

Estas en el tema de Sockets en java en el foro de Java en Foros del Web. Buenas tardes amigos del foro, he estado leyendo acerca de los sockets y quiero hacer lo siguiente: Tengo implementado una clase Servidor y otra clase ...
  #1 (permalink)  
Antiguo 30/12/2010, 13:47
 
Fecha de Ingreso: diciembre-2010
Ubicación: Bogotá
Mensajes: 22
Antigüedad: 6 años, 2 meses
Puntos: 0
Pregunta Sockets en java

Buenas tardes amigos del foro, he estado leyendo acerca de los sockets y quiero hacer lo siguiente:

Tengo implementado una clase Servidor y otra clase Cliente, el socket se crea perfectamente y existe la comunicacion, lo que quiero hacer es, saber desde el servidor si la conexion del cliente esta abierta o si ya se cerro, estuve leyendo por ahi y pues dicen que no se puede saber eso, me gustaria que me ayudaran por favor o si no en vez de utilizar sockets que otra cosa me podria servir, Muchas gracias


tengo implementado el ejemplo básico de sockets:

import java.io.*;

import java.net.*;

class Cliente {

static final String HOST = "localhost";

static final int PUERTO=5000;

public Cliente( ) {

try{

Socket skCliente = new Socket( HOST , Puerto );

InputStream aux = skCliente.getInputStream();

DataInputStream flujo = new DataInputStream( aux );

System.out.println( flujo.readUTF() );

skCliente.close();

} catch( Exception e ) {

System.out.println( e.getMessage() );

}

}

public static void main( String[] arg ) {

new Cliente();

}

}

----------Servidor----------

import java.io.* ;

import java.net.* ;

class Servidor {

static final int PUERTO=5000;

public Servidor( ) {

try {

ServerSocket skServidor = new ServerSocket( PUERTO );

System.out.println("Escucho el puerto " + PUERTO );

for ( int numCli = 0; numCli < 3; numCli++; ) {

Socket skCliente = skServidor.accept(); // Crea objeto

System.out.println("Sirvo al cliente " + numCli);

OutputStream aux = skCliente.getOutputStream();

DataOutputStream flujo= new DataOutputStream( aux );

flujo.writeUTF( "Hola cliente " + numCli );

skCliente.close();

}

System.out.println("Demasiados clientes por hoy");

} catch( Exception e ) {

System.out.println( e.getMessage() );

}

}

public static void main( String[] arg ) {

new Servidor();

}

}

en este caso el cliente llega pero se cierra, me gustaria que el cliente quedara abierto, y cuando se cierre, en el servidor aparezca algo como "el cliente "+numcliente+" ha cerrado" o algo asi

(disculpemen, pero soy nuevo y no se citar codigo)

Última edición por aegis900; 30/12/2010 a las 13:53 Razón: poner codigo
  #2 (permalink)  
Antiguo 30/12/2010, 15:03
 
Fecha de Ingreso: enero-2008
Mensajes: 614
Antigüedad: 9 años, 2 meses
Puntos: 57
Respuesta: Sockets en java

No hay un evento que indique que se ha perdido la conexion de algun socket. Lo que se hace generalmente es revisar si la conexion aun esta activa. Esto se hace tratando de leer del socket (creo que tambien se puede tratar de escribir al socket).

Cuando ejecutas readLine (o el metodo que utilices para leer datos) y se lanza una excepcion IOException significa que no se pudo ejecutar el metodo, generalmente esto sucede porque el socket esta desconectado.
  #3 (permalink)  
Antiguo 30/12/2010, 15:36
 
Fecha de Ingreso: diciembre-2010
Ubicación: Bogotá
Mensajes: 22
Antigüedad: 6 años, 2 meses
Puntos: 0
Respuesta: Sockets en java

listo, entiendo perfectamente, pero me gustaria saber como hago para que el cliente quede activo, es decir, no se cierre el socket, y si se cierra, que mande un mensaje al servidor diciendo que se cerró, gracias por la ayuda
  #4 (permalink)  
Antiguo 01/01/2011, 22:07
(Desactivado)
 
Fecha de Ingreso: diciembre-2008
Ubicación: por ahi!!!
Mensajes: 113
Antigüedad: 8 años, 3 meses
Puntos: 1
Respuesta: Sockets en java

Cita:
Iniciado por aegis900 Ver Mensaje
listo, entiendo perfectamente, pero me gustaria saber como hago para que el cliente quede activo, es decir, no se cierre el socket, y si se cierra, que mande un mensaje al servidor diciendo que se cerró, gracias por la ayuda
vos buscas tener transaccionalidad?
Porque si es asi, deberias crear tu propio protocolo o utilizar implementaciones
que ya manejan transaccionalidad. Hay varias, JPA, spring (tiene con aop una manera de
darle transaccionaldiad a los servicios), EJB, MQ y seguro hay bocha que son muy sencillas de reutilizar.
  #5 (permalink)  
Antiguo 03/01/2011, 09:39
 
Fecha de Ingreso: diciembre-2010
Ubicación: Bogotá
Mensajes: 22
Antigüedad: 6 años, 2 meses
Puntos: 0
Respuesta: Sockets en java

Bueno, voy a explicar realmente lo que necesito, espero me entiendan y me puedan ayudar:

Estoy haciendo una aplicacion con usuarios, tengo una tabla en la base de datos con los siguientes campos:

USUARIO PASSWORD ESTADO
administrador 12345 0

el campo ESTADO esta en 0, ya que el administrador no ha iniciado su sesion, y cuando la inicia, el campo ESTADO se pone en 1 de esta forma:

USUARIO PASSWORD ESTADO
administrador 12345 1

y si se cierra el programa (dando en el boton cerrar), el campo de ESTADO se actualiza y se vuelve a poner en 0. Hasta ahi todo bien, el programa me funciona perfecto.

El problema esta en lo siguiente, si el administrador inicia la sesion, y el programa no se finaliza dando el en boton cerrar (ya sea terminando el proceso desde el Administrador de Tareas) o simplemente apagando el computador o por un fallo de energia, etc. el campo ESTADO me queda en 1, no se me actualiza a 0, y de esta forma la proxima vez que el administrador desee iniciar la sesion, no lo deja, por lo que el campo ESTADO esta en 1. haciendo como si ya estuviera iniciada la sesion.

Este es mi problema, por eso pense que utilizando Sockets lo podria solucionar. Agradeceria a la persona que me pudiera ayudar, que depronto haya tenido el mismo inconveniente.
Muchas Gracias.
  #6 (permalink)  
Antiguo 03/01/2011, 11:29
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 9 años, 1 mes
Puntos: 260
Sonrisa Respuesta: Sockets en java

Hola,

Cita:
Iniciado por posman Ver Mensaje
Cuando ejecutas readLine (o el metodo que utilices para leer datos) y se lanza una excepcion IOException significa que no se pudo ejecutar el metodo, generalmente esto sucede porque el socket esta desconectado.
Exactamente, el InputStream.read() bloquea hasta que se cierra el stream.

Posiblemente, en el servidor crea un Thread (para no bloquear las siguientes conexiones) que se mantenga conectado pero el cliente no envíe nada de información, cuando se cierre el socket devuelve -1 o tira una exception.

Código Java:
Ver original
  1. protected void run() {
  2.   byte result = -1;
  3.   try {
  4.     result = in.read(); // bloquea y espera hasta que reciba un byte
  5.                                  // o se desconecte u otros
  6.   } catch (IOException e) {
  7.     result = -1;
  8.   }
  9.   // Cuando llegue aquí el socket está cerrado.
  10.   // Y result es -1.
  11. }
Saludos,
  #7 (permalink)  
Antiguo 02/01/2017, 12:43
Avatar de hoviedo  
Fecha de Ingreso: marzo-2007
Ubicación: Caracas - Venezuela
Mensajes: 5
Antigüedad: 10 años
Puntos: 0
Respuesta: Sockets en java

Saludos amigo, de casualidad veo este comentario, no importa lo que intentes aplicar, tu valor en la BD siempre sera el último antes del cierre abrupto de tu App, te sugiero
1.- No tengas el Administrador como usuario de gestión de datos, crea un usuario especial para eso, el administrador es para resolver problemas de gran envergadura
2.- Utiliza Cookies para el manejo de session ya que si tu cierre es repentino y descontrolado con solo eliminar las Cookies deberías poder acceder a la aplicación salvo no cumplas con el resto de las reglas definidas por para tal fin
3.- Si aún quieres hacerlo por la BD crea una App para gestión de Session que te permita cambiar el estatus de una o varias sessiones según sea el caso y basándote en el punto 1

Esto le sucede a cualquiera que maneja la session de ese modo y lo que regularmente se aplica es eso.... tener 2 App, 1 para acceder a la funcionalidad según el target y otra para gestionar los accesos de los usuarios



La zona horaria es GMT -6. Ahora son las 23:20.