bloque2:sockets
Diferencias
Muestra las diferencias entre dos versiones de la página.
bloque2:sockets [2023/05/17 22:21] – [Objetos] fernando | bloque2: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 '' | Cuando envío el mismo objeto repetidas veces a través del mismo extremo del socket, la clase '' | ||
- | Esto genera el problema de que si yo modifico propiedades de ese objeto; la clase '' | + | Esto genera el problema de que si yo modifico propiedades de ese objeto, el método |
<code java> | <code java> | ||
Línea 432: | Línea 432: | ||
persona.setNombre(" | persona.setNombre(" | ||
- | salida.writeObject(persona); | + | salida.writeObject(persona); |
persona.setNombre(" | persona.setNombre(" | ||
- | salida.writeObject(persona); | + | salida.writeObject(persona); |
</ | </ | ||
- | Cuando tengo una situación en la que debo enviar el mismo objeto modificado varias veces por un mismo canal, debo asegurarme de // | + | Cuando tengo una situación en la que debo enviar el mismo objeto modificado varias veces por un mismo canal, debo asegurarme de // |
Esto puede ser algo necesario en una aplicación en la que envío varias veces un mismo objeto '' | Esto puede ser algo necesario en una aplicación en la que envío varias veces un mismo objeto '' | ||
Línea 444: | Línea 444: | ||
En este caso, aparte de las clases para transmitir a través del socket, necesito leer desde un objeto //File// para enviarlo por el socket, y escribirlo en disco al recibirlo desde el otro lado del socket: Por lo tanto, necesito también las clases '' | En este caso, aparte de las clases para transmitir a través del socket, necesito leer desde un objeto //File// para enviarlo por el socket, y escribirlo en disco al recibirlo desde el otro lado del socket: Por lo tanto, necesito también las clases '' | ||
- | * Lado servidor: El Servidor | + | * Lado **emisor**: abre y lee un fichero de origen |
<code java> | <code java> | ||
- | private Socket | + | private Socket |
. . . | . . . | ||
FileInputStream lectorFichero = new FileInputStream(fichero); | FileInputStream lectorFichero = new FileInputStream(fichero); | ||
- | ObjectOutputStream salida = new ObjectOutputStream(cliente.getOutputStream()); | + | ObjectOutputStream salida = new ObjectOutputStream(socket.getOutputStream()); |
- | //Envío al cliente | + | //Envío al receptor |
salida.writeLong(fichero.length()); | salida.writeLong(fichero.length()); | ||
| | ||
Línea 465: | Línea 465: | ||
</ | </ | ||
- | * Lado cliente: El cliente | + | * Lado **receptor**: abre un fichero de destino y escribe en él lo que lee desde el Socket. |
<code java> | <code java> | ||
private Socket socket; | private Socket socket; | ||
Línea 472: | Línea 472: | ||
ObjectInputStream entrada = new ObjectInputStream(socket.getInputStream()); | ObjectInputStream entrada = new ObjectInputStream(socket.getInputStream()); | ||
- | //Leo el tamaño del fichero que me ha enviado el servidor | + | //Leo el tamaño del fichero que me ha enviado el emisor |
long fileSize = entrada.readLong() | long fileSize = entrada.readLong() | ||
Línea 479: | Línea 479: | ||
long totalLeido = 0; | long totalLeido = 0; | ||
//El bucle debe terminar cuando ha recibido la totalidad de bytes | //El bucle debe terminar cuando ha recibido la totalidad de bytes | ||
- | // Sin esa condición se va a quedar indefinidamente esperando a leer | + | // Sin esa condición, el bucle se va a quedar indefinidamente esperando a leer |
while( totalLeido < fileSize && (bytesLeidos = entrada.read(buffer)) > 0 ){ | while( totalLeido < fileSize && (bytesLeidos = entrada.read(buffer)) > 0 ){ | ||
| | ||
- | | + | |
} | } | ||
escritorFichero.close(); | escritorFichero.close(); | ||
</ | </ | ||
+ | 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 ('' | ||
==== 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.1684362103.txt.gz · Última modificación: 2024/09/16 20:53 (editor externo)