我正在使用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()");
  }
});

通过这种方法,我最终将在write()中看到日志消息,但是有时可能需要一段时间(几分钟)。这使我认为可能在后台进行了一些缓冲,并且直到刷新缓冲区后我才能获取数据。

我已经使用curl来验证服务器的行为是否正确。数据按时发送,到达时我没有收到回调。

我对OkHttpOkio的经验非常有限,因此很可能我弄乱了某些东西,或者忘记设置一些选项。任何帮助是极大的赞赏! :)

最佳答案

当您调用readAll()时,Okio首选净吞吐量而不是延迟,因此您的消息被缓冲成块。而是编写一个重复读入Buffer的循环。这样一来,您就会收到消息。

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

关于okhttp - 流okhttp响应主体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33446508/

10-12 02:10