流式传输okhttp响应体

Mik*_*ere 8 okhttp okio

我正在使用OkHttp 实现Server-Sent Events库.服务器发送事件的工作原理是保持与服务器的开放HTTP连接,"事件"可以在该服务器上流回客户端.连接仅在错误时关闭,或者客户端明确断开连接.

使用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()");
  }
});
Run Code Online (Sandbox Code Playgroud)

通过这种方法,我最终会看到日志消息write(),但有时可能需要很长时间(分钟).这让我觉得可能会有一些缓冲正在进行,我不会得到我的数据,直到刷新缓冲区.

我曾经用来curl验证服务器是否正常运行.该数据被准时送到,我只是没有得到我的回调,当它到达.

我有经验OkHttpOkio非常有限的,所以这是非常有可能的,我乱七八糟的东西了,或者忘记设置一些选项.任何帮助是极大的赞赏!:)

Jes*_*son 12

当你打电话给readAll()Okio时,他们更喜欢净吞吐量超过延迟,因此你的消息被缓冲成块.相反,写一个重复读入的循环Buffer.这会在他们到达时给你留言.

Buffer buffer = new Buffer();
while (!source.exhausted()) {
  long count = response.body().source().read(buffer, 8192);
  // handle data in buffer.
}
Run Code Online (Sandbox Code Playgroud)