NSA - Non Solo Amiga

SOFTWARE => Linguaggi di programmazione e scripting => Topic aperto da: clros - 27 Giugno 2011, 16:51:32

Titolo: [JAVA] Ricezioni caratteri da Socket Java
Inserito da: clros - 27 Giugno 2011, 16:51:32
Ciao a tutti, ho un problema con la ricezione di dati da un socket Java.

In pratica vorrei fare in modo di ricevere dati dal socket (sotto forma di singoli caratteri) fino a quando lo stream "è pieno" e non necessariamente fino a quando ricevo un carattere particolare (esempio 'n' oppure '')

Sto usando questo codice:
Codice: [Seleziona]
String recvMessage()
{
String s="";
int chr;
try
{
while ( (chr = in.read()) != -1){ //in è un oggetto di tipo InputStream collegato al socket
s+=(char)chr;
}//end while

}
catch(IOException exc){System.out.println("Interruzione ricezione from stream!");}

System.out.println("Ricevuto: "+ s);

return s;
}

In pratica non esce mai dal while nonostante nello stream non ci siano più caratteri da leggere e non viene nemmeno sollevata l'eccezione IOException.

Quindi questo metodo non ritorna mai la "stringa" ricevuta.

Ora, mi chiedo anche se quello che voglio fare sia materialmente possibile ottenerlo: Come fa un metodo (in qst caso read()) a capire che nello stream non ci sono più caratteri? Non potrebbe essere che ci siano ancora caratteri ma magari arrivano un po' in ritardo?
Titolo: Re: Ricezioni caratteri da Socket Java
Inserito da: TheKaneB - 27 Giugno 2011, 17:00:24
ovviamente lo stream si appoggia al protocollo TCP/IP per capire quando lo stream termina. In particolare avviene uno scambio di pacchetti FIN (fine) e ACK (messaggio ricevuto), che causano la terminazione del socket ad esso collegato.

Come già detto in altra sede, bisogna implementare una read non bloccante con timeout, usando dei thread di appoggio per conteggiare il tempo e interrompere manualmente la connessione (il timer va resettato alla ricezione di ogni carattere).

http://www.javacoffeebreak.com/articles ... _timeouts/ (http://www.javacoffeebreak.com/articles/network_timeouts/)

Enjoy ;)

PS: La durata del timeout è "application dependant", a occhio direi che un valore di 10 secondi è buono per la maggior parte degli utilizzi.
Titolo: Re: Ricezioni caratteri da Socket Java
Inserito da: clros - 27 Giugno 2011, 17:04:19
Grazie!

Mi chiedo se otterrei con meno fatica lo stesso effetto usando il metodo setSoTimeout() della classe socket. Cmq ads leggo il documento che mi hai postato!  ;)
Titolo: Re: Ricezioni caratteri da Socket Java
Inserito da: TheKaneB - 27 Giugno 2011, 17:07:45
Il documento che ho linkato spiega diversi metodi, compreso il timeout del socket :-)
Titolo: Re: Ricezioni caratteri da Socket Java
Inserito da: clros - 27 Giugno 2011, 17:49:22
Ma 10 secondi mi sembrano troppi! Pensavo a qualcosa come 250 mS!!
Titolo: Re: Ricezioni caratteri da Socket Java
Inserito da: TheKaneB - 27 Giugno 2011, 17:51:55
250 ms è nello stesso ordine di grandezza del ping. Su connessioni lente potresti non ricevere mai nemmeno un carattere!
EDIT: in realtà ho detto mezza cavolata, intendevo dire "nell'arco di una singola connessione".