Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [Java] Problema con trasferimento file tramite socket

    ho un server socket che rimane connesso e accetta file in entrata:
    codice:
    public class Server {
    
        private final int PORT = port;
    
        public static void main(String[] args) {
            Server s = new Server();
            s.listen();
        }
    
        private void listen() {
            try {
                ServerSocket ss = new ServerSocket(PORT);
                System.out.println("Sono sulla " + ss);
                for (;;) {
                    Socket s = ss.accept();
                    System.out.println("Conessione da " + s);
                    new MTManager(s).run();
                    Thread.sleep(100);
                }
            } catch (InterruptedException ex) {
                System.out.println(ex.getMessage());
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }
        }
    }
    dove MTManager server per gestire i thread e il salvataggio:
    codice:
    public class MTManager implements Runnable {
    
        private final String DIR_SAVE = "/media/hd/ftp";
        private Socket socket;
    
        public MTManager(Socket socket) {
            this.socket = socket;
        }
    
        public void run() {
            try {
                System.out.println("Presa in carico nuova connessione da " + socket);
                ObjectInputStream oin = new ObjectInputStream(socket.getInputStream());
                File inFile = (File) oin.readObject();
                File saveFile = new File(DIR_SAVE + "/" + inFile.getName());
                save(inFile, saveFile);
            } catch (Exception e) {
                System.out.println(e.getMessage());
            } finally {
                try {
                    socket.close();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
        }
    
        private void save(File in, File out) throws IOException {
            System.out.println(" --ricezione file " + in.getName());
            System.out.println(" --dimensione file " + in.length());
            FileInputStream fis = new FileInputStream(in);
            FileOutputStream fos = new FileOutputStream(out, true);
            byte[] buf = new byte[1024];
            int i = 0;
            while ((i = fis.read(buf)) != -1) {
                fos.write(buf, 0, i);
            }
            fis.close();
            fos.close();
            System.out.println(" --ricezione completata");
            OperationsFile.createLog("Nome file: " + in.getName() + "\nDimensione file: " + in.length());
        }
    }
    il client è:
    codice:
    public class Client {
    
        private final String HOST = "host";
        private final int PORT = port;
    
        public static void main(String[] args) {
            Client c = new Client();
            c.sendFile();
        }
    
        private void sendFile() {
            Socket socket = null;
            File file = new File(System.getProperty("user.home") + "/booklog.log");
            try {
                socket = new Socket(HOST, PORT);
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                oos.reset();
                oos.writeObject(file);
                oos.flush();
                oos.close();
            } catch (UnknownHostException ex) {
                System.out.println(ex.getMessage());
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }
        }
    }
    ora, se sia il client che il server risiedono sulla stessa macchina funziona tutto.
    se invece il server è su un altro pc allora riesco a connettermi ma nn ad inviare i file in quanto mi dice che prende il file da una directory che nn esiste (in questo caso la home del mac in ufficio).
    come posso fare??

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    L'oggetto File rappresenta solo un path verso un file, non il contenuto del file (e per questo se client e server sono sulla stessa macchina, funziona, altrimenti no).
    Se devi trasferire file via Socket, devi trasferirne il contenuto, leggendo i byte del file sorgente (a pacchetti) e trasferendo questi byte verso il server che li andrà a salvare in un file presso di lui.

    Trasferire un oggetto File è sempre una cosa priva di un significato concreto, quindi un errore.

    Cerca nel forum: ci sono decine di discussioni sull'argomento.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    bhe pensavo già di farlo nel metodo save:
    pensavo che nel client usando ObjectOutputStream lo facessi già.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da fermat
    bhe pensavo già di farlo nel metodo save:
    pensavo che nel client usando ObjectOutputStream lo facessi già.
    No e non c'entra niente l'uso di ObjectOutputStream o DataOutputStream o semplicemente un OutputStream generico.

    Nel client stai serializzando un oggetto di tipo java.io.File (ovvero, stai serializzando un percorso locale), non il contenuto del file (cosa che l'oggetto java.io.File non va nemmeno a guardare).

    Nel client devi leggere i byte del file (usando FileInputStream) e spedirli al server.

    Trovi un esempio banale in questa discussione.

    PS: il metodo save() del server non ha alcun senso. Il server non può andare a leggere i file nel client (attraverso il loro percorso locale): è il client che deve spedire i byte al server.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    ok ho capito il concetto, ma ancora alcune incertezze.
    ho modificato il client prendendo il tuo link come esempio:
    codice:
    public class Client {
    
        private final String HOST = "62.94.208.157";
        private final int PORT = 9977;
    
        public static void main(String[] args) {
            Client c = new Client();
            c.sendFile();
        }
    
        private void sendFile() {
            try {
                Socket socket = new Socket(HOST, PORT);
                File file = new File(System.getProperty("user.home") + "/booklog.log");
                FileInputStream in = new FileInputStream(file);
                FileOutputStream out = new FileOutputStream(file);
                byte[] buf = new byte[1024];
                int read;
                while ((read = in.read(buf)) != -1) {
                    out.write(buf, 0, read);
                }
                out.flush();
                in.close();
            } catch (UnknownHostException ex) {
                System.out.println(ex.getMessage());
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }
        }
    }
    m così nn mi sembra di spedire nulla.

    per quanto riguarda il server:
    codice:
        public void run() {
            try {
                ObjectInputStream oin = new ObjectInputStream(socket.getInputStream());
                File inFile = (File) oin.readObject();
                File saveFile = new File(DIR_SAVE + "/" + inFile.getName());
                save(inFile, saveFile);
            } catch (Exception e) {
                System.out.println(e.getMessage());
            } finally {
                try {
                    socket.close();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
        }
    
        private void save(File in, File out) throws IOException {
            System.out.println(" --ricezione file " + in.getName());
            System.out.println(" --dimensione file " + in.length());
            FileInputStream fis = new FileInputStream(in);
            FileOutputStream fos = new FileOutputStream(out, true);
            byte[] buf = new byte[1024];
            int i = 0;
            while ((i = fis.read(buf)) != -1) {
                fos.write(buf, 0, i);
            }
            fis.close();
            fos.close();
            System.out.println(" --ricezione completata");
            OperationsFile.createLog("Nome file: " + in.getName() + "\nDimensione file: " + in.length());
        }
    il metodo save prende due file (ingresso e uscita).
    quello in ingresso arriva da un ObjectInputStream oin = new ObjectInputStream(socket.getInputStream());
    e di inFile legge byte per byte.
    quindi nn capisco dove sbaglio, teoricamente è quello che mi hai detto.

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    out non deve essere un FileOutputStream (che è un oggetto atto a scrivere su un file), ma deve essere l'outputstream della socket.... i byte non li devi riscrivere in un nuovo file sul client, ma sulla socket...

    Chiaramente, dall'altra parte, il server deve sapere cosa sta ricevendo... quindi non userà più un ObjectInputStream per leggere (non spedisci oggetti, ma byte crudi) ma un DataInputStream o semplicemente l'InputStream della socket, riceverà i byte e li scriverà su un file usando un FileOutputStream.

    Lato client:

    codice:
    FileInputStream fis = new FileInputStream( fileDaInviare );
    OutputStream out = socket.getOutputStream();
    byte[] buf = new byte[1024];
    int read;
    while ((read = in.read(buf)) != -1) {
       out.write(buf, 0, read);
    }
    fis.close();
    
    // Se è finito, anche un out.close();
    Lato server:

    codice:
    ...
    InputStream is = socket.getInputStream();
    FileOutputStream fos = new FileOutputStream( fileDaScrivereNelServer );
    ...
    byte[] buf = new byte[1024];
    while((buf = is.read()) != -1) {
       fos.write(buf, 0, buf.length);
    }
    
    fos.close();
    
    // Se è finito, in.close();
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    grazie, mi mancavano InputStream e OutpuStream.
    codice:
    public class Client {
    
        private final String HOST = "host";
        private final int PORT = port;
    
        public static void main(String[] args) {
            Client c = new Client();
            c.sendFile();
        }
    
        private void sendFile() {
            try {
                Socket socket = new Socket(HOST, PORT);
                FileInputStream fis = new FileInputStream(System.getProperty("user.home") + "/booklog.log");
                OutputStream out = socket.getOutputStream();
                byte[] buf = new byte[1024];
                int read;
                while ((read = fis.read(buf)) != -1) {
                    out.write(buf, 0, read);
                }
                fis.close();
                out.close();
            } catch (UnknownHostException ex) {
                System.out.println(ex.getMessage());
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }
        }
    }
    codice:
    public class MTManager implements Runnable {
    
        private final String DIR_SAVE = "/media/hd/ftp";
        private Socket socket;
    
        public MTManager(Socket socket) {
            this.socket = socket;
        }
    
        public void run() {
            try {
                InputStream is = socket.getInputStream();
                FileOutputStream fos = new FileOutputStream(new File(DIR_SAVE + "/booklog.log"), true);
                byte[] buf = new byte[1024];
                int read;
                while ((read = is.read(buf)) != -1) {
                    fos.write(buf, 0, read);
                }
                fos.close();
                is.close();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            } finally {
                try {
                    socket.close();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
        }
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.