|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2001
Città: Castelnuovo R. (MO) Nato: 05/02/1984
Messaggi: 1683
|
Java: invio di file tramite byte[] tra socket
Devo riuscire a inviare un file da un client ad un altro client, questa è il code del client che invia:
Codice:
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");
Codice:
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();
da cosa puo dipendere questa cosa? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
forse dovresti fare un flush del buffer prima di chiudere lo stream.....
__________________
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Dec 2001
Città: Castelnuovo R. (MO) Nato: 05/02/1984
Messaggi: 1683
|
lato sender o receiver? flush dello stream del file o dello stream del socket?
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
*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.....
__________________
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Codice:
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");
Codice:
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();
__________________
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Dec 2001
Città: Castelnuovo R. (MO) Nato: 05/02/1984
Messaggi: 1683
|
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
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
ma corrotto in ke senso? troncato? con glu ultimi byte posti a zero? con dati ke nn c'entrano niente x tutto il file?
__________________
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Dec 2001
Città: Castelnuovo R. (MO) Nato: 05/02/1984
Messaggi: 1683
|
x verificare che il contenuto dell'array fosse identico tra il sender e il receiver avevo inserito dopo l'invio e la ricezione:
Codice:
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");
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 |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
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......
__________________
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Dec 2001
Città: Castelnuovo R. (MO) Nato: 05/02/1984
Messaggi: 1683
|
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: Codice:
bos.write(fileSend) -> bis.read(leggoFile) bos.flush() -> ? di default, il costruttore BufferedOutputStream ha 512 byte di buffer, x invio di file (P2P), è necessario aumentare? diminuire? |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:25.



















