Visualizzazione dei risultati da 1 a 3 su 3

Discussione: Trasferimento file

  1. #1

    Trasferimento file

    Salve ragazzi, ho passato tutto la sera a tentare di capire dove fosse il problema, ma aimè, non ci sono riuscito, per questo chiedo a voi.

    Sto scrivendo un'applicazione per il trasferimento di file.
    Premetto che l'applicazione, quindi un server e due client, in locale funziona correttamente, quindi permette ai due client di connettersi tra loro e scambiarsi il file.
    Il problema sorge quando l'applicazione la provo su internet, con un server su una postazione e due client su altrettante postazioni.
    In particolare il client che deve ricevere (destinatario) il file lancia un'eccezione del tipo FileNotFoundException e mi dice che NON trova il file specificato, segue quindi la scritta del path del file residente sul client mittente.

    allego il codice del destinatario:
    destinatario
    try {
    ObjectInputStream oin = new ObjectInputStream(socket.getInputStream());
    String currentDirectory = System.getProperty("user.dir");
    String downloadPath=currentDirectory+"/download";
    inFile = (File)oin.readObject();
    File saveFile = new File(downloadPath + "/" + inFile.getName());
    // salvo il file
    save(inFile, saveFile);
    } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    serversocket.close();
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    }

    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);
    byte[] buf = new byte[1024];
    int i = 0;
    while((i=fis.read(buf))!=-1) {
    fos.write(buf, 0, i);
    }
    // chiudo gli strams
    fis.close();
    fos.close();

    JOptionPane.showMessageDialog(null, "ricezione file completata");
    }
    ed ecco il codice del client mittente
    mittente
    [...]
    socket = new Socket();
    socket.connect(sockaddr, timeoutMs);
    socket.setSoTimeout(timeoutMs);
    System.out.println("connessione stabilita con il server peer!");
    System.out.println("inzio fase trasferimento file");
    String currentDirectory = System.getProperty("user.dir");
    String downloadPath=currentDirectory+"/download";
    filetoSend = new File (downloadPath + "/" + fileName);
    sendFile(filetoSend);
    socket.close();



    } catch (SocketTimeoutException e) {
    JOptionPane.showMessageDialog(null, "Impossibile stabilire connessione con il peer per il trasferimento del file!");
    } catch (IOException e) {
    JOptionPane.showMessageDialog(null, "Impossibile stabilire connessione con il peer per il trasferimento del file!");
    }
    finally {
    try {
    socket.close();
    } catch (IOException e) { }
    }


    }

    private void sendFile(File file) throws IOException {
    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
    oos.reset();
    oos.writeObject(file);
    oos.flush();
    oos.close();
    }
    Ringrazio tutti in anticipo per qualsiasi tipo di aiuto.
    Auguri a tutti e buone feste

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Spiegami come fa il destinatario a leggere il contenuto del file presente sull'host mittente (client) visto che riceve solo un oggetto File che rappresenta solamente un pathname astratto e che non ha nulla a che fare con il contenuto fisico del file.

    È il concetto che è proprio sbagliato! FileInputStream legge solo dal file-system locale. È inutile che ricevi un File che indica es. "blabla/download/pippo.txt" ... è solo un pathname! Se usi FileInputStream, cercherà di aprirlo in locale, mi sembra ovvio.

    Devi far trasferire tutto il contenuto del file byte per byte dal mittente al destinatario!

    Cioè, nel mittente apri il file, leggi i byte ed li invii sul socket. Nel destinatario, leggi i byte dal socket e li scrivi su un file.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Hai ragione, ma quello che mi dici per me è cosa nuova
    Comunque ora provo a cambiare con queste modifiche e vi faccio sapere.
    Sei stato molto utile e gentile.
    grazie e auguri

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.