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

manejo de Sockets

Estas en el tema de manejo de Sockets en el foro de Java en Foros del Web. hola a todos, Un poco de antecedente: Tengo un software en windows que recibe y envía datos por el puerto 8500 (tcp) y necesito hacer ...
  #1 (permalink)  
Antiguo 14/12/2010, 18:29
 
Fecha de Ingreso: noviembre-2007
Mensajes: 35
Antigüedad: 16 años, 5 meses
Puntos: 0
manejo de Sockets

hola a todos,

Un poco de antecedente:
Tengo un software en windows que recibe y envía datos por el puerto 8500 (tcp) y necesito hacer ese mismo programa pero que funcione en linux ya que hay que hacerle unas modificaciones y ademas no tenemos el fuente :S
Elegí java para no batallar por el sistema operativo.

Lo único que tengo es la documentación del protocolo de trasmisión, es decir, lo que significan los códigos hex que recibe y cuáles son los que puede enviar para que hagan algún efecto en el cliente.

Un ligero analisis de lo que pretendo hacer
He monitoreado la trasmisión de paquetes con el tcpdump y lo extraño que vi es que una vez que el cliente le manda un Sync al servidor, la conexión establecida nunca finaliza (no hay FIN, ni RESET) y es a travez de esta que se hacen las recepciones y envíos de datos mientras ambos este encendidos obviamente.


Mi avance

Trato de igualar este comportamiento para una prueba del concepto con el siguiente código:
Código java:
Ver original
  1. ...
  2. ServerSocket welcomeSocket = new ServerSocket(8500);
  3. while (true) {
  4.    System.out.println("Esperando: ");
  5.    Socket connectionSocket = welcomeSocket.accept();
  6.  
  7.    System.out.println("llego un cliente: ");
  8.    BufferedReader inFromClient = new BufferedReader(
  9.     new InputStreamReader(connectionSocket.getInputStream()));
  10.    clientSentence = inFromClient.readLine();
  11.    trama = clientSentence.getBytes();
  12.    /* algunas condiciones para saber si hay que enviar datos según lo que
  13.        diga la documentación del protocolo de comunicación
  14.        por ejemplo si manda el código 5001 hay que contesta con 4001
  15.        que indica que la conexión ha sido establecida*/
  16.  
  17.    /*¿debo cerrar la conexión?*/
  18.    connectionSocket.close();
  19. }

El problema
Aquí el problema que tengo es que el connectionSocket.close(); cierra la conexión (obviamente), (manda FIN y RESET) y entonces ya no puedo enviar datos al cliente, y el cliente a cada instante me manda la trama que indica establecer conexión (cuando esta solo la espero la primera vez que hay comunicación entre ambos)

Intente simplemente eliminar la línea connectionSocket.close(); y aunque no marca error al compilar, puedo recibir la primera trama pero ya no puedo mas, se queda en el mensaje Esperando: y si es un hecho que el cliente sigue mandando porque el tcpdump muestra actividad

intente con connectionSocket.shudownInput(); y sucede lo mismo, sigo sin poder recibir mas de un paquete o trama

La pregunta:
pues basicamente es eso, ¿cómo puedo hacerle para recibir paquetes sin que el servidor mande un FIN o RESET?


cualquier orientación al respecto se los agradeceré.
  #2 (permalink)  
Antiguo 15/12/2010, 09:41
 
Fecha de Ingreso: septiembre-2008
Ubicación: Córdoba
Mensajes: 67
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: manejo de Sockets

¿Probaste sacando esto fuera del while y sin cerrar la conexion?

Código:
Socket connectionSocket = welcomeSocket.accept();
  #3 (permalink)  
Antiguo 15/12/2010, 09:46
 
Fecha de Ingreso: septiembre-2008
Ubicación: Córdoba
Mensajes: 67
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: manejo de Sockets

Que quede algo así

Código:
#
ServerSocket welcomeSocket = new ServerSocket(8500);
#
System.out.println("Esperando: ");
#
   Socket connectionSocket = welcomeSocket.accept();
#
 
#
   System.out.println("llego un cliente: ");
#
   BufferedReader inFromClient = new BufferedReader(
#
    new InputStreamReader(connectionSocket.getInputStream()));
#
while (true) {
#
   clientSentence = inFromClient.readLine();
#
   trama = clientSentence.getBytes();
#
   /* algunas condiciones para saber si hay que enviar datos según lo que
#
       diga la documentación del protocolo de comunicación
#
       por ejemplo si manda el código 5001 hay que contesta con 4001
#
       que indica que la conexión ha sido establecida*/
#
 
#
   /*¿debo cerrar la conexión?*/
#
//   connectionSocket.close();
#
}
  #4 (permalink)  
Antiguo 15/12/2010, 10:35
 
Fecha de Ingreso: enero-2008
Mensajes: 614
Antigüedad: 16 años, 3 meses
Puntos: 57
Respuesta: manejo de Sockets

Primero que nada, tu codigo unicamente aceptara la conexion de un solo cliente (aunque tal vez eso no sea problema en lo que quieres hacer).
Otra cosa es que la funcion accept() bloquea el servidor hasta que se trata de conectar un cliente.

Lo que tendrias que hacer es utilizar hilos. Para cada cliente que se conecte creas un hilo y ese se mantendra ejecutandose mientras el cliente no cierre la conexion.

http://download.oracle.com/javase/tu...ets/index.html
  #5 (permalink)  
Antiguo 17/12/2010, 12:29
 
Fecha de Ingreso: noviembre-2007
Mensajes: 35
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: manejo de Sockets

de hecho posman si necesitaré hilos pero para la prueba del concepto solo necesito una conexión.

ya pude hacer lo que necesitaba, era mas o menos como lo mencionaba PachuG, el ciclo debía ser mas adelante, para lograrlo solo agrege un while en el metodo .readLine() quedandome asi

Código java:
Ver original
  1. BufferedReader inFromClient = new BufferedReader(
  2.     new InputStreamReader(connectionSocket.getInputStream()));
  3.  
  4. while (clientSentence = inFromClient.readLine() != null) {
  5. /* aquí el código para trabajar la trama
  6.  * o enviarle tramas a la IP que genero la conexión
  7.  */
  8.  
  9. }

gracias por su ayuda.

saludos

Etiquetas: manejo, sockets
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 12:51.