Autore Topic: [JAVA] Ricezioni caratteri da Socket Java  (Letto 1341 volte)

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
[JAVA] Ricezioni caratteri da Socket Java
« il: 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?
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5293
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Ricezioni caratteri da Socket Java
« Risposta #1 il: 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/

Enjoy ;)

PS: La durata del timeout è "application dependant", a occhio direi che un valore di 10 secondi è buono per la maggior parte degli utilizzi.
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: Ricezioni caratteri da Socket Java
« Risposta #2 il: 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!  ;)
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5293
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Ricezioni caratteri da Socket Java
« Risposta #3 il: 27 Giugno 2011, 17:07:45 »
Il documento che ho linkato spiega diversi metodi, compreso il timeout del socket :-)
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: Ricezioni caratteri da Socket Java
« Risposta #4 il: 27 Giugno 2011, 17:49:22 »
Ma 10 secondi mi sembrano troppi! Pensavo a qualcosa come 250 mS!!
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5293
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Ricezioni caratteri da Socket Java
« Risposta #5 il: 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".
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Tags: