PDA

View Full Version : Trasmissione di files via socket in Java


opiu
01-10-2002, 20:56
Nella mia applicazione java (mp3 sharing peer to peer) ho due threads server e client che permettono la trasmissione dei files

Il lato server invia un file mp3 nel modo seguente:

FileInputStream fis=new FileInputStream(mp3);
byte[] buffer=new byte[MAXBUF];
int cnt;
while ((cnt=fis.read(buffer))!=-1){
out.write(buffer, 0, cnt);
}



il lato client invece riceve con:

FileOutputStream fos=new FileOutputStream(mp3);
byte[] buffer=new byte[MAXBUF];
while ((cnt=in.read(buffer))!=-1){
fos.write(buffer, 0, cnt);
}



Questo codice funziona ma rende l'applicazione estremamente lenta nello svolgere le altre operazioni(avviare altri downloads oppure visualizzarne lo stato ecc) cosa posso fare?
inoltre quale è la funzione dei BufferedInput/OuputStreams?

grazie mille ciao

Tassadar
02-10-2002, 12:15
In che senso diventano lente, lente nello scaricare o che?

kingv
02-10-2002, 12:49
Originariamente inviato da opiu
[B]oltre quale è la funzione dei BufferedInput/OuputStreams?





dalla documentazione javadoc:

By setting up such (BufferedOutputStream n.d.KingV :) ) an output stream, an application can write bytes to the underlying output stream without necessarily causing a call to the underlying system for each byte written.



direi che fanno al caso tuo ;)

Tassadar
02-10-2002, 12:53
Bàh, secondo me con Buffered* rimanda il problema a quando il buffere deve essere svuotato :)

Meglio sarebbe utilizzare una politica di banda :) ammesso che il suo problema sia di banda e non di occupazione CPU.

opiu
02-10-2002, 14:04
il mio è un problema di cpu perchè le prove le sto facendo in locale su un solo pc. A dire il vero ho fatto anche una prova in intranet e il problema sembra sempre la cpu.
il ciclo è corretto?la dimensione della costante MAXBUF è 1024 cosa dite?sinceramente il codice l'ho trovato su un forum.
ora provo con il buffered stream
ciao e grazie

Tassadar
02-10-2002, 14:29
magari dopo ogni invio prova a mettere il thread in sleep per un tot di ms, magari riesci a risolvere. Mi sembra comunque strano, con righe di codice molto simili alle tue non ho avuto grossi problemi di CPU :)

P.S. Quando ricevi una connessione apri un altro thread e la fai gestire a lui oppure gestisci tutto in uno?

opiu
02-10-2002, 14:40
Apro un thread ad ogni connessione

Tassadar
02-10-2002, 15:31
L'unica cosa che mi viene in mente oltre a quello che ti ho già detto è di cambiare la thread priority :)

opiu
02-10-2002, 16:58
ho aggiunto tutti i bufferedstream ma la situazione sembra migliorata di pochissimo.Il pc continua ad accedere al disco fisso



Altra questione:è possibile chiudere un thread?e una serie di thread(della stessa classe)?

ciao grazie

Tassadar
02-10-2002, 17:16
In che senso? Se è per terminarli puoi usare Stop (che però è deprecato)
altrimenti fai un ciclio tipo while(variabile booleana) e per stopparlo fai un metodo variabile booleana = false :)