Newsgroup: it.comp.java
Titolo: Inviare un file dal server al client: dove sbaglio?

Ciao a tutti,
ho realizzato un'applicazione client/server nel quale il server invia un 
dato file al client.
Il file effettivamente arriva al client, ha la stessa dimensione del 
file originale e, analizzandone il contenuto con un banale editor 
esadecimale, non ï¿œ vuoto (ovvero tutti i suoi byte hanno un valore 
diverso da 0).
Il problema ï¿œ che il file ricevuto non ï¿œ apribile con i comuni 
visualizzatori. Se per esempio il file originale sul server ï¿œ 
un'immagine JPG, non risulta possibile visualizzarla sul client.
Probabilmente ï¿œ un errore banale e ovviamente proverï¿œ a fare il debug 
del protocollo che uso. Intanto perï¿œ ho pensato che magari postandovi il 
codice del mio programma, qualcuno piï¿œ esperto di me o piï¿œ abituato a 
lavorare con i file in JAVA potesse individuare subito dov'ï¿œ l'errore 
(forse un banale problema di conversione errata dei singoli bytes, ho 
pensato io).
In pratica il codice sul server ï¿œ questo (un po' tagliato):
--------------------
private Socket s;
out = new ObjectOutputStream(s.getOutputStream());
File file = new File(fileName);
FileInputStream input = null;
byte[] buffer = new byte[new Long(file.length()).intValue()];
input = new FileInputStream(file);
while (true) {
	int byteRead = input.read(buffer);
	if (byteRead <= 0) {
		break;
	}
out.writeObject(inviaFile(buffer));
out.flush();
--------------------
Sul client invece grossomodo ï¿œ cosï¿œ:
--------------------
private Socket s;
in = new ObjectInputStream(s.getInputStream());
byte[] file = (byte[]) in.readObject();
File file_tmp = File.createTempFile("temp", null);
FileOutputStream fos = new FileOutputStream(file_tmp);
fos.write(file);
--------------------
Vi balzano subito all'occhio errori grossolani?
-- 
Elminster

 byte[] file = (byte[]) in.readObject();
[...]
ObjectInputStream e ObjectOutputStream rispettivamente deserializza e 
serializza istanze di oggetti, se il tuo e' un file jpg non puoi 
aspettarti che che alla fine torni ad essere un jpg.

 aspettarti che che alla fine torni ad essere un jpg.
Mmhhh... e quindi? ;-)
Cosa devo usare al posto di quegli stream? :)
-- 
Elminster


non ho letto bene tutta la pappardella iniziale ma la classe ImageIO
penso possa tornarti utile

 out.writeObject(inviaFile(buffer));
cosa ritorna inviaFile?
perche' non serializzi direttamente buffer?

Oltre a quanto già detto per gli ObjectIput/OutputStream non me sembra
ma ho dato solo un'occhiata fugace al tuo codice
Io 3 settimane fa avevo riadattato il codice presente qua:
http://www.computersciencenotes.net/index.php?option=com_phocadownload&view=category&id=13:java-programming&Itemid=2
è in italiano la docs
Ciao Marco

il 02.12.2009 17.28, Scrive Elminster 43514776:

Guarda, la mia obiezione deriva sostanzialmente dal fatto che non so 
cosa faccia il metodo inviaFile. Teoricamente sostituendo:
out.writeObject(inviaFile(buffer));
semplicemente con
out.writeObject(buffer);
tecnicamente vorrebbe significare la serializzazione dell'oggetto 
"byte[] buffer" via rete. Pero' sinceramente non ci ho mai provato, e se 
non funzionasse mi asterrei dall'indagare il perche'! :-)
Grosso modo, se sostituisci a ObjectOutputStream un BufferedOutputStream 
e corrispondentemente a ObjectInputStream un BufferedInputStream, a 
parte i metodi readObject e writeObject ed il metodo inviaFile che no so 
cosa faccia, dovrebbe continuare a funzionare tutto.
Direi che pero' potresti anche evitarli, leggendo e scrivendo 
direttamente dal FileInputStream e nel SocketOutputStream e, viceversa 
lato client, dal SocketInputStream e nel FileOutputStream, magari in un 
loop utilizzando un buffer di transito.

 out.writeObject(buffer);
Errore di trascrizione mio: in realtï¿œ il codice ï¿œ 
out.writeObject(buffer), quell'inviaFile mi era sfuggito e deriva da una 
precedente versione del programma ma ora non c'ï¿œ piï¿œ.
-- 
Elminster

hybris ha scritto:

Scusatemi, non c'� nessun inviaFile, il codice corretto �
out.writeObject(buffer);
-- 
Elminster

il 02.12.2009 18.54, Scrive Elminster 43514776:

E allora non indagerei oltre, probabilmente l'uso che fai 
dell'ObjectOutputStream e del suo corrispondente non ne rispetta il 
contratto. Utilizza come output e input quelli restituiti da 
socket.getOutputStream() e socket.getInputStream() che fai prima.