首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >流式okhttp响应体

流式okhttp响应体
EN

Stack Overflow用户
提问于 2015-10-30 23:54:53
回答 1查看 7.9K关注 0票数 8

我正在使用服务器发送事件实现一个OkHttp库。服务器发送事件的工作方式是保持与服务器的开放HTTP连接,在此服务器上“事件”可以流回客户端。只有在出现错误或客户端显式断开连接时,连接才会关闭。

使用OkHttp实现这种流行为的最佳方法是什么?我试着做这样的事情:

代码语言:javascript
运行
复制
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的经验非常有限,所以很可能我搞砸了一些事情,或者忘了设置一些选项。如有任何帮助,将不胜感激!)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-31 03:37:29

当您调用readAll()时,Okio更喜欢网络吞吐量而不是延迟,因此您的消息被缓冲为块。相反,编写一个反复读取到Buffer中的循环。当他们到达的时候会给你带来信息。

代码语言:javascript
运行
复制
Buffer buffer = new Buffer();
while (!source.exhausted()) {
  long count = response.body().source().read(buffer, 8192);
  // handle data in buffer.
}
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33446508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档