PDA

Visualizza la versione completa : [Java] stream in rete


fedetallo
03-02-2005, 11:39
Salve, ho un piccolo quesito da proporvi: ho creato una piccola rete domestica composta da due pc e ho fatto un programmino d test che sfrutta i socket x trasferire 1 file. Il file viene letto da un oggetto FileInputStream e scritto direttam nell'oggetto d tipo OutputStream ottenuto dal socket. poi presente un ciclo while che fino a qnd nn viene raggiunta la fine del file scrive ogni byte letto nel flusso d output del socket. Il processo ricevente analogo: legge dall'input del socket e scrive su file. Se i due programmi li faccio eseguire sulla stessa macchina funziona tutto bene, ma se lo faccio sulle due macchine trasferisce solo alcuni byte e poi tutto si blocca. Devo riavviare il pc server (quello che invia il file) xch altrimenti i due pc non si vedono nemmeno pi in risorse d rete. Cosa mi consigliate d fare? Devo sfruttare qualche classe di I/O particolare? Grazie, Fede

fedetallo
03-02-2005, 20:30
x intenderci, il codice del server il seguente


ServerSocket server = new ServerSocket(1984);
socket = server.accept();
in = new FileInputStream("file.txt");
out = socket.getOutputStream();
int b = in.read();

while(b != -1)
{
out.write(b);
b = in.read();
}
out.write(-1);


mentre quello del client



socket = new Socket("192.168.0.1",1984);
out = new FileOutputStream("c:\\file.txt");
in = socket.getInputStream();
int b;
while((b = in.read()) != -1) out.write(b);

LeleFT
03-02-2005, 20:42
Mi sembra strano che ti dia di questi problemi... io ho utilizzato esattamente lo stesso meccanismo per implementare il trasferimento file nella mia chat e funziona senza problemi... :bh:


Ciao. :ciauz:

fedetallo
03-02-2005, 20:44
ma hai esato le stess classi di I/O oppure ad esempio hai usato il datainputstream, ecc...?

LeleFT
03-02-2005, 20:48
Beh... dato che si tratta di una chat, che deve trasferire dati eterogenei (messaggi testuali, informazioni di settaggio tra server e client, parti di file e flag vari) non ho usato proprio un semplice OutputStream, ma mi sono appoggiato ad un ObjectInputStream, ma il meccanismo lo stesso.
In fin dei conti c' un Messaggio (che un oggetto) che viaggia nella rete che, all'interno, contiene una parte del file che deve essere trasferita.


Ciao. :ciauz:

fedetallo
03-02-2005, 20:56
si, ho capito. forse io sbaglio xch utilizzo invece direttamente gli outputstream... beh, ora provo. grazie!

fedetallo
05-02-2005, 01:36
ho provato utilizzando i DataInputStream e DataOutputStream ma nn cambiato nulla. sembra quasi che la rete s intasi, xch subito dopo nn, sebbene i processi vengano chiusi la rete rimane cm bloccata. eppure nn ho mai avuto problemi nel trasferimento normale d file, quindi il problema nn risiende nella rete stessa ma nel programma... cm fare???

LeleFT
06-02-2005, 10:32
Prova a postare tutto il codice... :bh:


Ciao. :ciauz:

robyp
06-02-2005, 13:08
Hai provato a bufferizzare lo stream che leggi?

BufferedInputStream in = new BufferedInputStream(socket.
getInputStream());

o

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

Nel caso di file bibari meglio che usi il primo modo.

poi alla fine fai un in.close() e socket.close()?

fedetallo
08-02-2005, 23:32
non ho bufferizzato ma ho provato ad usare i DataInputStream e DataOutputStream... leggevo e scrivevo tramite i metodi readByte() e writeByte().

per quanto riguarda la chiusura dei socket e dei flussi di I/O tutto ok.

ho provato a mettere un p di println nel codice e quello ke ho dedotto ke il problema risiede probabilmente nel client. legge solo il primo carattere e poi si blocca sulla seconda read



in = new DataInputStream(socket.getInputStream());
byte b = in.readByte();
boolean done = false;

while(!done)
{
try{b = in.readByte();}
catch(Exception e) {System.out.println(e.getMessage());done = true;}
}

lui praticamente esegue la read fuori dal ciclo, ma non la prima dentro il ciclo. il server invece continua a scrivere e si blocca a circa 8000 byte... probabilmente a quel punto il buffer pieno, il server rimane in attesa che il client legga i byte e rimane bloccato. difatti nno lancia eccezioni e sono costretto a chiuderlo manualmente. non viene quindi eseguita la chiusura del socket e di conseguenza la rete si blocca.

il problema ora individuare la causa della non lettura del client!!!

Loading