2015-10-30 18 views
6

Ich implementiere eine Server-Sent Events Bibliothek mit OkHttp. Server Sent Events funktioniert, indem eine offene HTTP-Verbindung zum Server aufrechterhalten wird, auf dem Ereignisse zum Client zurückgestreamt werden können. Die Verbindung wird nur bei Fehlern geschlossen oder wenn der Client explizit die Verbindung trennt.Streaming okhttp Antwort Körper

Was ist der beste Weg, um dieses Streaming-Verhalten mit OkHttp zu erreichen? Ich habe so etwas wie zu tun versucht:

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()"); 
    } 
}); 

Mit diesem Ansatz werde ich schließlich die Log-Nachricht in write() sehen, aber es kann manchmal eine ganze Weile (Minuten). Das lässt mich glauben, dass unter der Haube etwas Pufferung stattfindet und ich meine Daten erst bekomme, wenn der Puffer geleert ist.

Ich habe curl verwendet, um zu überprüfen, ob sich der Server korrekt verhält. Die Daten sind werden pünktlich gesendet, ich bekomme gerade nicht meinen Rückruf, wenn es ankommt.

Meine Erfahrung mit OkHttp und Okio ist sehr begrenzt, so ist es sehr möglich, dass ich etwas vermasselt habe, oder vergessen habe, eine Option zu setzen. Jede Hilfe wird sehr geschätzt! :)

+0

Ist diese Bibliothek irgendwo verfügbar? :) – wblaschko

Antwort

9

Wenn Sie readAll() aufrufen, bevorzugt Okio den Nettodurchsatz über die Latenzzeit, sodass Ihre Nachrichten in Chunks gepuffert werden. Schreiben Sie stattdessen eine Schleife, die wiederholt in eine Buffer einliest. Das bringt dir Nachrichten, wenn sie ankommen.

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

Funktioniert wie ein Charme! Vielen Dank :) –

Verwandte Themen