import java.io.*;
import java.net.*;

public class Servidor_Fichero{
    public static void main(String args[]){
        ServerSocket servidor;
        Socket socket;
        try{
            servidor=new ServerSocket(5001);
            while(true){
                // Espero que se conecte el cliente
                System.out.println("1.- Esperando");
                socket=servidor.accept();
                System.out.println("2.- Ha llegado");
                // Creo el flujo de salida y de entrada
                OutputStream flujoSalida=socket.getOutputStream();
                DataOutputStream dos=new DataOutputStream(flujoSalida);
                InputStream flujoEntrada=socket.getInputStream();
                DataInputStream dis=new DataInputStream(flujoEntrada);
                // Mando el listado de ficheros (Solo ficheros para que no se confunda)
                String andeEmpiezo=".\\";
                File origen=new File(andeEmpiezo);
                String[] s=origen.list();
                System.out.println("3.- Listando ficheros");
                for(int i=0;i<s.length;i++){
                    File f=new File(origen+s[i]);
                    if(!f.isDirectory()){
                        dos.writeUTF(s[i]);
                        System.out.println(s[i]);
                    }
                }
                dos.writeUTF("FIN");
                // Recojo el fichero que desea copiar
                String cual=dis.readUTF();
                System.out.println("4.- Elegido: "+cual);
                // Le envio el fichero solicitado en trozos de 1kb
                FileInputStream fichero=new FileInputStream(andeEmpiezo+cual);
                byte[] trozo=new byte[1024];
                int leidos=fichero.read(trozo);
                while(leidos>-1){
                    if(leidos<1024) dos.write(trozo,0,leidos);
                    else dos.write(trozo);
                    dos.flush();
                    System.out.println("enviado un cacho");
                    leidos=fichero.read(trozo);
                }
                // Cierro en orden
                fichero.close();
                dos.close();
                flujoSalida.close();
                dis.close();
                flujoEntrada.close();
                // Cierro la conexion y vuelvo a esperar
                socket.close();
            }
        }catch(Exception e){
        }
    }
}
