List
con una lista de objetos que se ha ido actualizando añadiendo o eliminando elementos.
==== Ficheros ====
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 FileIn(Out)putStream
.
- Lado servidor: El Servidor lee un fichero de disco y lo envía por el Socket al cliente.
private Socket cliente; . . . FileInputStream lectorFichero = new FileInputStream(fichero); ObjectOutputStream salida = new ObjectOutputStream(cliente.getOutputStream()); //Envío al cliente el tamaño total del fichero salida.writeLong(fichero.length()); byte[] buffer = new byte[1024]; int bytesLeidos = 0; while( (bytesLeidos = lectorFichero.read(buffer)) > 0){ //Envio datos a través del socket salida.write(buffer, 0, bytesLeidos); //Me aseguro de que se escriben todos lo bytes del buffer salida.flush(); } lectorFichero.close();
- Lado cliente: El cliente abre un fichero de destino y escribe en él lo que lee desde el servidor.
private Socket socket; . . . FileOutputStream escritorFichero = new FileOutputStream(ficheroDestino); ObjectInputStream entrada = new ObjectInputStream(socket.getInputStream()); //Leo el tamaño del fichero que me ha enviado el servidor long fileSize = entrada.readLong() byte[] buffer = new byte[1024]; int bytesLeidos; long totalLeido = 0; //El bucle debe terminar cuando ha recibido la totalidad de bytes // Sin esa condición se va a quedar indefinidamente esperando a leer while( totalLeido < fileSize && (bytesLeidos = entrada.read(buffer)) > 0 ){ escritorFichero.write(buffer, 0, bytesLeidos); totalLeido += bytesLeidos; } escritorFichero.close();==== 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.
- Lado servidor:
//Lista Strings que contiene las rutas de los ficheros disponibles List<String> listaFicheros; //Se la envía al cliente cuando se conecta salida.writeObject(listaFicheros); //Espera la selección del cliente String seleccion = (String)entrada.readObject(); //Crea el fichero para enviar su tamaño y disponerse a enviarlo a través del socket File fichero = new File(seleccion); salida.writeLong(fichero.length()); //Procede a leer el fichero y enviarlo a través del socket como en el ejemplo anterior
- Lado cliente:
//El cliente recibe la lista de ficheros disponibles al conectarse List<String> listaFicheros = (List<String>)entrada.readObject(); . . . //Envía al servidor el String con la selección del usuario salida.writeObject(ficheroElegido); //Espera a recibir el tamaño del fichero para proceder la lectura long fileSize = entrada.readLong(); //Procede a leer desde el socket como en el ejemplo anterior y escribirlo en fichero
Video: Transferir objetos, bytes y tipos de datos primitivos a través de sockets
===== Proyectos de ejemplo ===== Diferentes proyectos de este tema, junto con los expuestos en los videos, se pueden encontrar en el repositorio de red de Bitbucket. Los proyectos de los ejercicios que se vayan haciendo en clase estarán disponibles en el repositorio psp-ejercicios de Bitbucket
===== Prácticas =====
- Práctica 2.1 Creación de una aplicación cliente-servidor
© 2025 Santiago Faci y Fernando Valdeón