2015-10-30 3 views
6

Я реализую библиотеку Server-Sent Events с использованием OkHttp. Server Sent Events работает, поддерживая открытое HTTP-соединение с сервером, на котором «события» могут быть переданы обратно клиенту. Соединение будет закрываться только при ошибках или если клиент явно отключается.Streaming okhttp response body

Каков наилучший способ достижения этого потокового поведения с помощью OkHttp? Я пытался сделать что-то вроде:

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

С таким подходом я в конечном итоге увидеть сообщение войти write(), но иногда это может занять некоторое время (минуты). Это заставляет меня думать, что под капотом может быть какая-то буферизация, и я не получаю свои данные до тех пор, пока буфер не будет сброшен.

Я использовал curl, чтобы убедиться, что сервер ведет себя правильно. Данные отправляются вовремя, я просто не получаю свой обратный вызов, когда он прибывает.

Мой опыт работы с OkHttp и Okio очень ограничен, поэтому очень возможно, что я что-то испортил или забыл установить какой-то вариант. Любая помощь очень ценится! :)

+0

Является ли эта библиотека доступной где-нибудь? :) – wblaschko

ответ

9

Когда вы звоните readAll() Окио предпочитает чистую пропускную способность за латентность, и поэтому ваши сообщения буферизуются в куски. Вместо этого напишите цикл, который повторно читает в Buffer. Это принесет вам сообщения по мере их поступления.

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

Работает как очарование! Благодаря :) –