2015-10-30 19 views
6

Sto implementando una libreria Server-Sent Events utilizzando OkHttp. Server Sent Events funziona mantenendo una connessione HTTP aperta al server su cui 'eventi' possono essere trasmessi in streaming al client. La connessione si chiude solo sugli errori o se il client si disconnette esplicitamente.Streaming corpo risposta okhttp

Qual è il modo migliore per ottenere questo comportamento di streaming utilizzando OkHttp? Ho cercato di fare qualcosa di simile:

response.body().source().readAll(new Sink() { 
    @Override 
    public void write(Buffer source, long byteCount) throws IOException { 
    Log.d(TAG, "write(): byteCount = "+byteCount); 
    } 

    @Override 
    public void flush() throws IOException { 
    Log.d(TAG, "flush()"); 
    } 

    @Override 
    public Timeout timeout() { 
    return Timeout.NONE; 
    } 

    @Override 
    public void close() throws IOException { 
    Log.d(TAG, "close()"); 
    } 
}); 

Con questo approccio sarò finalmente vedere il messaggio di log in write(), ma a volte può prendere un po 'di tempo (minuti). Questo mi fa pensare che potrebbe esserci un po 'di buffering in corso sotto il cofano e non ottengo i miei dati fino a quando il buffer non viene scaricato.

Ho usato curl per verificare che il server si comporti correttamente. I dati sono inviati in tempo, non ricevo la mia richiamata quando arriva.

La mia esperienza con OkHttp e Okio è molto limitata, quindi è molto probabile che abbia incasinato qualcosa o abbia dimenticato di impostare qualche opzione. Qualsiasi aiuto è molto apprezzato! :)

+0

Questa libreria è disponibile da qualche parte? :) – wblaschko

risposta

9

Quando si chiama readAll(), Okio preferisce il throughput netto sulla latenza e quindi i messaggi vengono archiviati in blocchi. Invece, scrivi un ciclo che si legge ripetutamente in un Buffer. Ti daranno i messaggi non appena arrivano.

Buffer buffer = new Buffer(); 
while (!source.exhausted()) { 
    long count = response.body().source().read(buffer, 8192); 
    // handle data in buffer. 
} 
+0

Funziona come un fascino! Grazie :) –

Problemi correlati