PDA

View Full Version : Java: invio di file tramite byte[] tra socket


dooka
06-06-2005, 16:14
Devo riuscire a inviare un file da un client ad un altro client, questa è il code del client che invia:
socket_client = new Socket(ip_client,porta_client);
File fileGive = new File (dir_upload,nomeFile);
FileInputStream fis = new FileInputStream(fileGive);
OutputStream os = socket_client.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(os);
stream.scriviDOS(socket_client,fileGive.getName());
int fileSize = fis.available();
byte[] fileSend = new byte[fileSize];
String dim = Integer.toString(fileSize);
stream.scriviDOS(socket_client,dim);
System.out.println("Il file e' grande "+dim);

fis.read(fileSend);
bos.write(fileSend);
System.out.println("FILE INVIATO");

e questo è il code del client che riceve:
InputStream is = client_socket.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
String fileToSave = stream.leggiDIS(client_socket);
FileOutputStream fos = new FileOutputStream(fileToSave);
int fileSize = Integer.parseInt(stream.leggiDIS(client_socket));
System.out.println("il file è grande "+fileSize+" bytes");
byte[] leggoFile = new byte[fileSize];

bis.read(leggoFile);

System.out.println("FILE ARRIVATO");
fos.write(leggoFile);
System.out.println("File salvato come "+fileToSave);
fos.close();


il problema è che l'array di byte che invio tra i 2 programmi a volte arriva integro (ultimo byte che parte -39, ultimo byte che arriva -39), altre volte sia in locale che via ip, l'array presenta le ultime celle tutte a 0, nonostante sia partito con l'ultimo valore a -39

da cosa puo dipendere questa cosa?

^TiGeRShArK^
06-06-2005, 16:50
forse dovresti fare un flush del buffer prima di chiudere lo stream.....

dooka
06-06-2005, 16:51
lato sender o receiver? flush dello stream del file o dello stream del socket?

^TiGeRShArK^
06-06-2005, 19:50
*credo* ke il prob sia la prima parte del codice, perkè se finisce in quel modo brutale non hai effettuato nè il flush nè il close, e qdi potrebbe dare di questi problemi in caso non faccia in tempo a svuotare il buffer prima della terminazione del programma....
questo almeno in via teorica.....

^TiGeRShArK^
06-06-2005, 19:54
socket_client = new Socket(ip_client,porta_client);
File fileGive = new File (dir_upload,nomeFile);
FileInputStream fis = new FileInputStream(fileGive);
OutputStream os = socket_client.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(os);
stream.scriviDOS(socket_client,fileGive.getName());
int fileSize = fis.available();
byte[] fileSend = new byte[fileSize];
String dim = Integer.toString(fileSize);
stream.scriviDOS(socket_client,dim);
System.out.println("Il file e' grande "+dim);

fis.read(fileSend);
bos.write(fileSend);
bos.flush();
bos.close();
System.out.println("FILE INVIATO");


InputStream is = client_socket.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
String fileToSave = stream.leggiDIS(client_socket);
FileOutputStream fos = new FileOutputStream(fileToSave);
int fileSize = Integer.parseInt(stream.leggiDIS(client_socket));
System.out.println("il file è grande "+fileSize+" bytes");
byte[] leggoFile = new byte[fileSize];

bis.read(leggoFile);

System.out.println("FILE ARRIVATO");
fos.write(leggoFile);
fos.flush();
System.out.println("File salvato come "+fileToSave);
fos.close();


io lo modificherei così.... ma potrebbe anke essere un atro il prob... cmq prova così e vedi ke succede....

dooka
08-06-2005, 10:36
ho provato a fare .flush agli stream e chiuderli come mi hai consigliato, in locale praticamente ad ogni invio mi funziona ma via ip l'array di byte arriva quasi sempre corrotto e il file nn viene visualizzato :(

^TiGeRShArK^
08-06-2005, 11:48
ma corrotto in ke senso? troncato? con glu ultimi byte posti a zero? con dati ke nn c'entrano niente x tutto il file?

dooka
08-06-2005, 12:00
x verificare che il contenuto dell'array fosse identico tra il sender e il receiver avevo inserito dopo l'invio e la ricezione:
for(int i=0; i<fileSize; i++)
System.out.println("byte "+fileSend[i]+" caricato");


for(int i=0; i<fileSize; i++)
System.out.println("byte "+leggoFile[i]+" ricevuto");

cosi facendo stampavo a video tutti i byte letti e poi tutti i byte che venivano ricevuti

a quanto pare l'ultimo byte dell'array prima di essere inviato è -39, mentre chi lo riceve, gli ultimi 20 byte (circa) sono tutti a 0 :(

^TiGeRShArK^
08-06-2005, 17:45
in pratica ti perde l'utlimo pakketto....
ma 6 sicuro di avere kiuso tutti gli stream e anke la connessione PRIMA di stampare il file inviato e ricevuto.... perkè il problema sembrebbe proprio questo, dato ke in locale te lo manda molto più velocemente tra i processi e qdi fa in tempo a ricevere tutto, mentre in remoto non fa in tempo a ricevere l'ultimo pacchetto......

dooka
09-06-2005, 12:07
quindi sembrerebbe essere un problema di "sincronizzare" i 2 canali in maniera che se il flush dell'output porta a inviare ancora dati, l'input possa leggerli giusto?

vediamo:


bos.write(fileSend) -> bis.read(leggoFile)
bos.flush() -> ?

nel caso che il metodo flush preveda ancora byte nel buffer, questi byte, che intuisco siano quelli che il receiver perde, come possono essere presi dal receiver?

di default, il costruttore BufferedOutputStream ha 512 byte di buffer, x invio di file (P2P), è necessario aumentare? diminuire?