PDA

View Full Version : [JAVA] Inviare file di un oggetto serializzato da server a client


cdere
03-07-2010, 21:11
Salve a tutti,
innanzitutto grazie a quanti risponderanno, veniamo al problema:

applicazione client-server, il server serializza un oggetto con il seguente metodo:

public void sendFile(ObjectOutputStream out) throws FileNotFoundException, IOException{
OutputStream outStream = new BufferedOutputStream( out );
// Definisco l'OutputStream necessario per la serializzazione dell'oggetto (ObjectOutputStream)
ObjectOutputStream objStream = new ObjectOutputStream( outStream );
objStream.writeObject(this); // serializzazione

outStream.close(); // chiudo lo stream (necessario per gestire la bufferizzazione)
}

out come si può vedere è un ObjectOutputStream che ottengo dalla socket, bene.
Quello che voglio fare è scrivere l'oggetto serializzato su file sul client quindi cosa faccio:

OutputStream outFile=new FileOutputStream("prova.dat");
byte buf[] = new byte[1024];
int len;
while((len = in.read(buf))>0)
outFile.write(buf, 0, len);
outFile.close();

il file lo scrive ma differisce stranamente di qualche byte, chiaramente poi la deserializzazione non funziona, aiuuuuuto :D

p.s. se c'è una maniera meno grezza di trasferire questo benedetto file di un oggetto serializzato ben venga ;)

nuovoUtente86
03-07-2010, 22:36
Perchè fare tutto questo giro di stream: sul server hai il riferimento all' ObjectOutputstream che wrappa lo stream di connessione, bene utilizza quello per spedire l' oggetto. Lato client, fai l' operazione inversa, sparando l' input ricevuto dal socket, attraverso un ObjectOutputstream linkato ad un filestream, su file.

cdere
03-07-2010, 22:55
per quanto riguarda lato server perfetto hai assolutamente ragione chiudo così:
public void sendFile(ObjectOutputStream out) throws FileNotFoundException, IOException{
ObjectOutputStream auxOut = new ObjectOutputStream(out);
auxOut.writeObject(this);
auxOut.close();
}

mentre lato client non ti seguo mi dispiace.. puoi essere un attimo più chiaro?

edit:

se intendi:
OutputStream outFile=new FileOutputStream(fs.getSelectedFile().getAbsolutePath() + ".dat");
ObjectOutputStream prova = new ObjectOutputStream(outFile);
try {
prova.writeObject(in.readObject());
}
catch (ClassNotFoundException ex) {
System.out.println("AAAAA");
}

non può funzionare perchè la classe dell'oggetto che voglio serializzare sul file sul client non esiste neanche, e infatti mi da ClassNotFoundException!

Grazie mille

nuovoUtente86
03-07-2010, 23:23
Se parli di oggetti, devi avere la loro definizione ovvero la classe, altrimenti stai spedendo un flusso di byte senza significato lato client. Puoi farne uno storage, ma difficilmente li sfrutterai a livello applicativo se non definisci un tuo protocollo, ma a questo punto ha poco senso far transitare oggetti nudi e puri. Altrimenti importa la classe anche sul client e utilizzi il metodo di cui sopra.

cdere
03-07-2010, 23:27
a me infatti serve un flusso di byte nudi e puri da far arrivare al client per permettergli di salvare questo flusso su un file binario

nuovoUtente86
03-07-2010, 23:37
come già detto li puoi anche scrivere su file con il tuo metodo, ma dopo non puoi fartee nulla, soprattutto deserializzarli.

cdere
03-07-2010, 23:49
va bene ma non mi serve deserializzarli..

comunque il mio metodo in realtà funziona, è solo che quando poi dalla parte del server chiudo quell' ObjectOutputStream (se non lo chiudo non funziona) poi come lo riapro?

nalsk
04-07-2010, 01:26
hai provato ad utilizzare al posto di un .close() un .flush() per svuotare il buffer? se il trasferimento avviene ad esempio tramite socket (molto utile anche in locale) credo sia al massimo quest'ultimo che dev'essere chiuso quando non serve più, non lo stream :)