08/05/09 19:50
mutelg
Salve ho un diavolo di problema da quasi due settimane e non ne riesco a venire a capo, sto sviluppando un piccolo server di controllo remoto e tra i vari comandi, c'è l'uppload e il download di file, tutto liscio se non fose che questi benedetti file arrivamo con gli ultimi byte mozzati, ho testato il programma con un file di testo con righe numerate e mancano all'incirca le ultime 300 righe. Se lo faccio in locale funziona a meraviglia inviando 100 byte per volta, se lo provo in LAN o su internet succede quello che vi ho detto prima. Vi prego siete la mia ultima speranza dopo di che mi UCCIDO. Posto la parte di codice interessata:
Lato Client:
Lato Server:
Lato Client:
dalServer = new BufferedReader(new InputStreamReader(conn.getInputStream())); String nomeF = dalServer.readLine(); int grandezzaF = Integer.parseInt(dalServer.readLine()); int buff = grandezzaF / 10000; byte buffer[] = new byte[HTTP.pacchetto]; streamI = new DataInputStream(conn.getInputStream()); //cerco o creo il punto dove salvare il file ricevuto File dir = new File("C:\ricevuti\"); if(!dir.exists()) if(dir.mkdir()) System.out.println("Cartella ricevuti creata!"); else System.out.println("Cartella ricevuti non è stato possibile crearla!"); File file = new File("c:\ricevuti\"+nomeF); scriviFile = new FileOutputStream(file); JOptionPane.showMessageDialog(null,"Trasferimento file in corso!"); int y=0; for(int i=0; i<grandezzaF/HTTP.pacchetto;i++) { //si tratta di un help graficp per farmi rendere conto di a // che punto si trova con la ricezione del file if(y>buff-1) { System.out.print("|"); y=0; } //leggo il file in un buffer streamI.read(buffer); //scrivo il buffer sul file scriviFile.write(buffer); y++; } //leggo e scrivo l'ultimo buffer che molto probabilmente //non è di 100 byte e quindi lavoro con la rimanenza streamI.read(buffer, 0, (int)grandezzaF%HTTP.pacchetto); scriviFile.write(buffer, 0, (int)grandezzaF%HTTP.pacchetto-1); JOptionPane.showMessageDialog(null,"Trasferimento file Completato!"); //chiudo file, connessione e stream streamI.close(); scriviFile.close(); conn.close();
Lato Server:
alClient = new PrintStream(conn.getOutputStream()); streamO = new DataOutputStream(conn.getOutputStream()); FileI = new FileInputStream(percorso+nomeF); //cerco o creo un punto dove memorizzare i file inviati File dir = new File("C:\inviati\"); if(!dir.exists()) if(dir.mkdir()) System.out.println("Cartella inviati creata!"); else System.out.println("Cartella inviati non è stato possibile crearla!"); File file = new File("c:\inviati\"+nomeF); FileOutputStream scriviFile = new FileOutputStream(file); byte buffer[] = new byte [HTTP.pacchetto]; alClient.println(nomeF); int grandezzaF = FileI.available()+1; alClient.println(grandezzaF); JOptionPane.showMessageDialog(null,"Invio in corso!"); //invio il file for(int i=0;i<grandezzaF/HTTP.pacchetto; i++) { //leggo il file in un buffer FileI.read(buffer); //scrivo il buffer in un file per memorizzare ciò che invio scriviFile.write(buffer); //invio il buffer tramite stream streamO.write(buffer); } //leggo ed invio l'ultimo pacchetto di dati FileI.read(buffer, 0, (int)grandezzaF%HTTP.pacchetto); scriviFile.write(buffer, 0, (int)grandezzaF%HTTP.pacchetto-1); streamO.write(buffer, 0, (int)grandezzaF%HTTP.pacchetto-1); JOptionPane.showMessageDialog(null,"File inviato con successo!"); //chiudo stream, FIle e connessione streamO.close(); FileI.close(); conn.close();
Ultima modifica effettuata da mutelg 08/05/09 20:06
aaa