API Sockets - TCP Receive

API Sockets - TCP Receive

de Sergio Leandro Carrasco Sanguinetti -
Número de respuestas: 5

En el API para la operación receive se dice:

data, err = client.receive() --> Realiza una lectura en un socket conectado. Devuelve la información disponible en el stream data. Si expira el timeout sin obtener datos nuevos devuelve en data: '' (vacío) y en err: 'timeout'.


Como se venían resolviendo los ejercicios de sockets (usando un API parecida a la de Java), para recibir datos del socket, lo que se hacia era obtener el InputStream asociado al Socket y luego hacer sucesivas lecturas sobre este stream. Ej:

String leido = "";

InputStream inputStream = socketClient.getInputStream();

while (line = inputStream.readLine != '""){   // lee linea a linea el stream hasta que encuentra una linea vacía

   leido = leido + linea;

}


¿Con la nueva API se trabajaría de una forma similar? Ejemplo:

String leido = "";

data, err = socketClient.receive();    // Segun el API data es un Stream

while (line = data.readLine != '""){

   leido = leido + linea;

}


Esto que digo no veo que cuadre con el tema del timeout. Porque, según la definición del API, nos enteramos del timeout solo al llamar al receive y no al consumir el stream data. Cuadraría más que el consumo del stream lanzara una excepción si se da un timeout.

En respuesta a Sergio Leandro Carrasco Sanguinetti

Re: API Sockets - TCP Receive

de Jorge Visca -

Con "stream" se refiere al stream de TCP. O sea, cada llamada a receive() extrae y devuelve en un string todo lo que haya llegado por TCP hasta ese momento. Ese equivalente a como funciona la API de C.


En respuesta a Jorge Visca

Re: API Sockets - TCP Receive

de Sergio Leandro Carrasco Sanguinetti -

Bien. Gracias por la pronta respuesta.

Para el ejemplo concreto que propuse, en el que se espera una linea vacía (dos saltos de linea consecutivos) para detectar el final de una petición, seria:

String leido = "";

do{

  linea, err = socketClient.receive();  // lee y limpia el buffer de recepción

  if (err == ""){  // si no hubo error

    leido = leido + linea;

  }

} while ((err == "") && (!linea.contain("\n\n")))    

// mientras no haya error y no lleguen los dos saltos de linea consecutivos se sigue leyendo




En respuesta a Jorge Visca

Re: API Sockets - TCP Receive

de Sergio Leandro Carrasco Sanguinetti -

Bien. Gracias por la pronta respuesta.

Para el ejemplo concreto que propuse, en el que se espera una linea vacía (dos saltos de linea consecutivos) para detectar el final de una petición, seria:

String leido = "";

do{

  linea, err = socketClient.receive();  // lee y limpia el buffer de recepción

  if (err == ""){  // si no hubo error

    leido = leido + linea;

  }

} while ((err == "") && (!linea.contain("\n\n")))    

// mientras no haya error y no lleguen los dos saltos de linea consecutivos se sigue leyendo




En respuesta a Sergio Leandro Carrasco Sanguinetti

Re: API Sockets - TCP Receive

de Romina Julieta Parada Venossa -

Creo que seria asi si el socket es no bloqueante (  socketClient.setTimeout(x) con x mayor o igual a 0 ):

String leido = "";

do{

  linea, err = socketClient.receive();

  if (err == "error"){ 

    socketClient.close(); 

    return;

  }

  leido = leido + linea;

} while ((err == "timeout"));


o asi si es bloqueante (  socketClient.setTimeout(-1) ):

linea, err = socketClient.receive();

if (err == "error"){ 

  socketClient.close(); 

  return;

}

Aprovecho para consultar si esto es correcto y si hay alguna configuracion por defecto que se pueda asumir para el timeout.


En respuesta a Romina Julieta Parada Venossa

Re: API Sockets - TCP Receive

de Bruno Fabian Piaggio Klimas -

En cuanto al primer ejemplo, me parece correcto, el único detalle que la condición del while creo que es  err == "" && !linea.contain("\n\n") y la condición del if error != "" como puso Sergio en https://eva.fing.edu.uy/mod/forum/discuss.php?d=132166#p308374 


Por defecto se asume para TCP la recepción es bloqueante:


"...Los modos bloqueante o no bloquenate se aplican a las operaciones de lectura, escritura y accept. Por defecto los sockets se crean como bloqueantes."


(página 2 de la cartilla)


Adjunté dos ejemplos (cliente y servidor TCP) en un comprimido, son muy similares a los que subieron los profesores pero en Python. Por ahí ayuda para entender mejor, el uso es bastante parecido a los definidos en la cartilla.