gpt4 book ai didi

okhttp - 流式传输 okhttp 响应正文

转载 作者:行者123 更新时间:2023-12-04 06:16:58 37 4
gpt4 key购买 nike

我正在实现 Server-Sent Events使用 OkHttp 的库。服务器发送事件的工作原理是与服务器保持开放的 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验证服务器的行为是否正确。数据正在按时发送,我只是在它到达时没有收到我的回调。

我对 OkHttp 的体验和 Okio非常有限,所以很可能我搞砸了,或者忘记设置一些选项。任何帮助是极大的赞赏! :)

最佳答案

当您调用 readAll() Okio 更喜欢净吞吐量而不是延迟,因此您的消息被缓冲成 block 。相反,编写一个循环重复读入 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/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com