PDA

View Full Version : [JAVA/Servlet] Output "a pezzettini"


lovaz
10-03-2010, 19:06
Salve a tutti,

Il mio problema è che devo spedire al client dell'output
testuale in momenti diversi, ma nell'ambito della stessa richiesta (doGet).

Ho provato a fare una prova così:

for( int i = 0; i < 10; i++ ) {
Thread.sleep(1000);
w.print(i);
w.flush();
}

ma mi stampa sul browser la stringa intera "0123..." dopo 10 secondi,
e non una cifra al secondo.

Si può fare?

Grazie

nuovoUtente86
10-03-2010, 20:34
questo deriva dal funzionamento di http che è stateless, perchè una volta consegnata la risposta si perde lo stato conversazione ed in base alle versione si chiude anche la connessione, senza aspettare un timeout.
Probabilmente la soluzione al tuo problema può essere un server-push(HTTP streaming) e/o AJAX.

lovaz
11-03-2010, 19:28
A me sembra più che altro che flush non funzioni a dovere...

Potrei provare con una strategia "long polling":
nel caso della prova di prima chiedo un numero, che viene ritornato
dopo 1 secondo, poi ne chiedo immediatamente un altro, e così via.

Ma non mi sembra la soluzione ottimale.

Grazie comunque

minerte
11-03-2010, 19:33
..penso dipenda dal protocollo http prova prima del flush a mettere un carattere a capo...

lovaz
11-03-2010, 19:57
Provato, non va.

Ma ho scoperto che dopo aver scritto poco più di 1000 caratteri
flush comincia a funzionare!

tomminno
11-03-2010, 20:18
ma mi stampa sul browser la stringa intera "0123..." dopo 10 secondi,
e non una cifra al secondo.

Si può fare?

Grazie

Si può fare ma non come intendi te. Il browser ovviamente mostrerà il risultato solo quando ha ricevuto l'intera risposta HTTP che avviene appunto dopo 10 secondi. Nel tuo caso l'alternativa corretta è impiegare Ajax lato client.

minerte
11-03-2010, 21:41
..scusa non avevo letto che volevi vederlo dal browser....allora mi sà che ho vai di chiamate asincrone o vai di chiamate asincrone...

lovaz
12-03-2010, 19:14
Si può fare ma non come intendi te. ... <CUT> ... l'alternativa corretta è impiegare Ajax lato client.
Se vedi il msg sopra funziona, dopo aver scritto response.getBufferSize() caratteri.
Per quanto riguarda AJAX non me ne intendo, per caso fa più richieste HTTP, una per ogni "dato"?
non avevo letto che volevi vederlo dal browser
Non è che voglio vederlo da browser, era solo per vedere l'output.
In realtà lo devo leggere da un'applicazione Flex, e a tal proposito ho aperto un altro thread:
http://www.hwupgrade.it/forum/showthread.php?t=2159359