流式传输 okhttp 响应正文
Streaming okhttp response body
我正在使用 OkHttp 实现一个 Server-Sent Events 库。 Server Sent Events 的工作原理是保持与服务器的开放 HTTP 连接,'events' 可以在该服务器上流式传输回客户端。连接只会在出现错误或客户端明确断开连接时关闭。
使用 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
方面的经验非常有限,所以很可能我搞砸了某些事情,或者忘记设置某些选项。任何帮助是极大的赞赏! :)
当您调用 readAll()
时 Okio 更喜欢净吞吐量而不是延迟,因此您的消息被缓冲成块。相反,编写一个重复读入 Buffer
的循环。这会在消息到达时向您发送消息。
Buffer buffer = new Buffer();
while (!source.exhausted()) {
long count = response.body().source().read(buffer, 8192);
// handle data in buffer.
}
我正在使用 OkHttp 实现一个 Server-Sent Events 库。 Server Sent Events 的工作原理是保持与服务器的开放 HTTP 连接,'events' 可以在该服务器上流式传输回客户端。连接只会在出现错误或客户端明确断开连接时关闭。
使用 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
方面的经验非常有限,所以很可能我搞砸了某些事情,或者忘记设置某些选项。任何帮助是极大的赞赏! :)
当您调用 readAll()
时 Okio 更喜欢净吞吐量而不是延迟,因此您的消息被缓冲成块。相反,编写一个重复读入 Buffer
的循环。这会在消息到达时向您发送消息。
Buffer buffer = new Buffer();
while (!source.exhausted()) {
long count = response.body().source().read(buffer, 8192);
// handle data in buffer.
}