我正在使用服务器发送事件实现一个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
的经验非常有限,所以很可能我搞砸了一些事情,或者忘了设置一些选项。如有任何帮助,将不胜感激!)
发布于 2015-10-31 03:37:29
当您调用readAll()
时,Okio更喜欢网络吞吐量而不是延迟,因此您的消息被缓冲为块。相反,编写一个反复读取到Buffer
中的循环。当他们到达的时候会给你带来信息。
Buffer buffer = new Buffer();
while (!source.exhausted()) {
long count = response.body().source().read(buffer, 8192);
// handle data in buffer.
}
https://stackoverflow.com/questions/33446508
复制相似问题