首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尽管使用flush(),但OkHttp在上载数据之前会缓冲约800KB

尽管使用flush(),但OkHttp在上载数据之前会缓冲约800KB
EN

Stack Overflow用户
提问于 2014-05-12 10:58:03
回答 3查看 1.7K关注 0票数 7

我正在尝试发布图像的上传进度,使用okhttp作为我的客户端上传它们,并使用mimecraft打包多部分文件。

当数据被写入套接字时,我添加了日志来写入字节计数(如果我能正确判断的话,以4kb为单位),然后上传。

问题是,虽然我在每次写入数据块时都会在输出流上调用flush,但在大约800KB写入输出流之前,似乎什么都不会上载。一旦达到这一点,它似乎会上传大约100kb,然后应用程序会向输出流写入另一个100KB(就像它释放的空间,可以写入更多空间),然后继续。

这样做的结果是(超过1.2mb的文件)第一个800kb几乎立即被写入/报告,然后它开始上传(通过charles网络软件跟踪),然后在接下来的几秒钟内开始100kb的读/写/上传,然后一旦我将最后一个字节写入输出流,应用程序报告100%的上传被写入。这是真的,因为网络客户端仍在上传仍在网络缓冲区中的最后800kb,并在那里等待5-10秒上传,然后完成请求。

有没有人有过这样的经历,或者知道这是不是okhttp中的常见问题?

干杯

编辑:如果我上传了一个小于800KB的文件,我测试了一些250kb和500kb的文件,它们在上传之前都会立即100%写入到流中,但3mb的图像仍然会上传800kb,然后以大约100kb的区块进行滴答,每次上传一些图片时,写入循环都会坐在那里写入100kb。

EN

回答 3

Stack Overflow用户

发布于 2016-04-20 06:37:06

正如@nmr的答案所说,这是因为发送缓冲区太高了,正如这里的错误标签所解释的那样:https://github.com/square/okhttp/issues/1078

因此,我创建了一个套接字工厂,它允许您覆盖发送缓冲区的大小。

https://gist.github.com/slightfoot/00a26683ea68856ceb50e26c7d8a47d0

票数 3
EN

Stack Overflow用户

发布于 2014-10-14 05:26:24

套接字发送缓冲区默认设置为较高的值,并且未连接刷新。我一直试图找到一种同步Java套接字的方法,但没有成功,默认的套接字OutputStream会忽略刷新。

https://github.com/square/okhttp/issues/1078

可怕的hack fork在这里设置发送缓冲区大小:https://github.com/ACMEAtronOmatic/okhttp/tree/topic/hack-to-fix-socket-sendbuffer-size

票数 1
EN

Stack Overflow用户

发布于 2014-05-12 20:07:18

在打开输出流之前,请尝试调用setFixedLengthStreamingMode(content length)setChunkedStreamingMode(0)

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23600397

复制
相关文章

相似问题

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