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

    Errore trasferimento file client/server

    ciao a tutti,
    sto facendo un programma per trasferire un file qualsiasi da un pc ad un altro collegati in lan tramite lo schema server/client. utilizzo questo codice, dopo aver fatto la socket sia nel server (destinatario) che nel client (mittente):


    // --- LATO CLIENT --

    codice:
    ObjectOutputStream oos = new ObjectOutputStream( socket.getOutputStream() );
    
    // Leggo il file da inviare
    FileInputStream fis = new FileInputStream( fileDaInviare );
    byte [] pacchetto = new byte[ fis.available() ];
    fis.read( pacchetto );
    fis.close();
    
    // Invio il pacchetto dati al server
    oos.writeObject( pacchetto );

    // --- LATO SERVER ---

    codice:
    ObjectInputStream ois = new ObjectInputStream( socket.getInputStream() );
    
    // Ricevo il pacchetto dati
    byte[] pacchetto = (byte[]) ois.readObject();
    
    // Lo scrivo nel file di destinazione
    FileOutputStream fos = new FileOutputStream( fileDiDestinazione );
    fos.write( pacchetto );
    fos.close();
    



    però ciò non funziona e quando provo ad inviare un file mi da l'errore:
    java.io.FileNotFoundException: C:\Users\User\Desktop (Access is denied)
    dove C:\Users\User\Desktop sarebbe la cartella dove voglio salvare il file sul server
    qualcuno sa dove sbaglio e mi sa spiegare come correggere?
    Ultima modifica di LeleFT; 28-11-2014 a 12:10 Motivo: Aggiungi i tag CODE

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    539
    essendo un server, potrebbe avere più di un client collegato,
    come fa la funzione ricevente a sapere che deve ascoltare solo quello specifico client ?
    io non conosco molto, ma mi sembra quasi .... la trasmissione su porta seriale, dove si parlano due macchine ben definite
    ciao
    Marino

  3. #3
    utilizzo una socket tcp quindi il server si mette in ascolto e un client si collega. da quel che avevo capito io le socket tcp sono connessioni punto-punto quindi non dovrebbe essere possibile collegare direttamente al server più client (magari il multiclient è possibile utilizzando dei thread sul server). comunque il problema rimane e non credo sia collegato alla socket dato che la connessione sembra andare a buon fine

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Lato client: cos'è la variabile "fileDaInviare"?
    Se è una stringa, verifica cosa c'è scritto.
    Se è un oggetto File, verifica a cosa sta puntando: metodo getAbsolutePathName().

    L'errore è chiaro: stai cercando di leggere la directory e non un file in quella directory.

    Quindi, o la stringa (fileDaInviare) è sbagliata o l'oggetto File (fileDaInviare) punta ad una directory e non ad un file.


    Ad ogni modo, anche se non è sbagliato il modo in cui lo stai facendo, sconsiglio di trasmettere file di dati usando ObjectInput/OutputStream. Molto meglio inviare array di byte crudi su Input/OutputStream semplici: non hai problemi di enconding e ti risparmi un bel po' di byte in trasmissione (tutto l'header della serializzazione).


    Ciao.
    Ultima modifica di LeleFT; 28-11-2014 a 12:15
    "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
    grazie della risposta, ho risolto: l'errore non era nel client ma nel server perchè cercava di scrivere il file con solo il percorso della cartella ma senza il nome del file. comunque il metodo che consigliavi com'è strutturato? perchè non ho ben capito la differenza con quello che ho postato

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ah, ok... pensavo che quell'errore venisse lanciato lato client. Effettivamente, quell'eccezione viene sollevata anche nel caso lato server non venga specificato il nome del file, ma solo il percorso.

    Ciò che intendevo io è che non è consigliabile usare ObjectInput/OutputStream per la trasmissione di files. E' più conveniente usare gli stream semplici:


    Lato client:

    codice:
    OutputStream os = socket.getOutputStream();
    
    // Leggo il file e lo invio a blocchi di N byte (esempio: 4096 byte = 4 KB)
    byte[] buffer = new byte[4096];
    FileInputStream fis = new FileInputStream( fileDaLeggere );
    int bytesLetti = 0;
    while((bytesLetti = fis.read(buffer)) >= 0) {
       os.write(buffer, 0, bytesLetti);
    }
    os.flush();

    Lato server:

    codice:
    // Leggo da InputStream il file:
    InputStream is = socket.getInputStream();
    
    // Lo leggerò a blocchi di 4 KB, finchè non è finito
    FileOutputStream fos = new FileOutputStream( fileDaScrivere );
    byte[] buffer = new byte[4096];
    int byteLetti = 0;
    while((bytesLetti = is.read(buffer)) >= 0) {
       fos.write(buffer, 0, bytesLetti);
    }
    fos.flush();

    Questo è solo la base: non c'è gestione delle eccezioni, non c'è trasmissione di numero di byte da leggere/scrivere che potrebbe essere una buona cosa per il controllo dei dati, ecc.


    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
    Ok grazie mille

Tag per questa discussione

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.