Herramientas de usuario

Herramientas del sitio


bloque2:sockets

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

bloque2:sockets [2023/05/17 23:25] – [Ficheros] fernandobloque2:sockets [2024/09/16 20:53] (actual) – editor externo 127.0.0.1
Línea 423: Línea 423:
 Cuando envío el mismo objeto repetidas veces a través del mismo extremo del socket, la clase ''ObjectOutputStream'' almacena en caché una copia de ese objeto, para que el envío sea más rápido la próxima vez. Cuando envío el mismo objeto repetidas veces a través del mismo extremo del socket, la clase ''ObjectOutputStream'' almacena en caché una copia de ese objeto, para que el envío sea más rápido la próxima vez.
  
-Esto genera el problema de que si yo modifico propiedades de ese objeto; la clase ''ObjectOutputStream'' no puede reconocer si el objeto se ha modificado o es el mismo de antes, y envía la copia que tiene en caché de ese objeto:+Esto genera el problema de que si yo modifico propiedades de ese objeto, el método ''writeObject()'' no puede reconocer si el objeto se ha modificado o es el mismo de antes, y envía la copia que tiene ya en caché de ese objeto:
  
 <code java> <code java>
Línea 432: Línea 432:
  
 persona.setNombre("Juan") persona.setNombre("Juan")
-salida.writeObject(persona); //Envía la copia almacenada en cache (sin modificar)+salida.writeObject(persona); //Envía la copia almacenada en cache (nombre->Fernando)
  
 persona.setNombre("Maria"); persona.setNombre("Maria");
-salida.writeObject(persona);  //Envía la copia almacenada en cache (sin modificar)+salida.writeObject(persona);  //Envía la copia almacenada en cache (nombre->Fernando)
 </code> </code>
  
Línea 482: Línea 482:
 while( totalLeido < fileSize && (bytesLeidos = entrada.read(buffer)) > 0 ){ while( totalLeido < fileSize && (bytesLeidos = entrada.read(buffer)) > 0 ){
    escritorFichero.write(buffer, 0, bytesLeidos);    escritorFichero.write(buffer, 0, bytesLeidos);
-   totalLeido += bytesLeidos;+   totalLeido += bytesLeidos; //Llevo la cuenta de los bytes leidos
 } }
 escritorFichero.close(); escritorFichero.close();
 </code> </code>
  
-Como acabamos de ver, para enviar un fichero, la parte del programa que lo envía a través del socket necesita enviarle previamente el tamaño de fichero para que el receptor sepa cuantos bytes debe leer. Si no enviamos el tamaño del fichero al receptor, el receptor nunca va a saber cuando ha recibido la totalidad del fichero, y se quedará esperando a leer indefinidamente.+Como acabamos de ver, para enviar un fichero, la parte del programa que lo envía a través del socket necesita enviarle previamente el tamaño de fichero para que el receptor sepa cuántos bytes debe leer. Si no enviamos el tamaño del fichero al receptor, el receptor nunca va a saber cuándo ha recibido la totalidad del fichero, y se quedará esperando a leer desde el socket indefinidamente.
  
-Esto no ocurre con el flujo de lectura desde fichero, solamente con los flujos de lectura desde el socket. Cuando leemos desde un flujo de fichero (FileInputStream), hay un momento en que los bytes de ese fichero se acaban y el bucle se termina. Sin embargo al leer de un socket, no puedo saber cuando se acaban los bytes ya que el socket sigue abierto durante la ejecución de todo el programa, y puedo seguirlo usando para enviar otros ficheros.+Esto no ocurre con el flujo de lectura desde fichero, solamente con los flujos de lectura desde el socket. Cuando leemos desde un flujo de fichero (''FileInputStream''), hay un momento en que los bytes de ese fichero se acaban y el bucle se termina. Sin embargo al leer de un socket, no puedo saber cuándo se acaban los bytes ya que el socket seguirá abierto durante la ejecución de todo el programa, y puedo seguirlo usando para recibir otros ficheros más tarde.
 ==== Diferentes tipos de datos ==== ==== Diferentes tipos de datos ====
 Enviar objetos es útil, y lo podemos aplicar a la transferencia de ficheros. El cliente podría indicarle al servidor qué fichero desea descargar de una lista que previamente le envía el servidor. Enviar objetos es útil, y lo podemos aplicar a la transferencia de ficheros. El cliente podría indicarle al servidor qué fichero desea descargar de una lista que previamente le envía el servidor.
bloque2/sockets.1684365904.txt.gz · Última modificación: 2024/09/16 20:53 (editor externo)