我正在尝试发布图像的上传进度,使用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。
发布于 2016-04-20 06:37:06
正如@nmr的答案所说,这是因为发送缓冲区太高了,正如这里的错误标签所解释的那样:https://github.com/square/okhttp/issues/1078
因此,我创建了一个套接字工厂,它允许您覆盖发送缓冲区的大小。
https://gist.github.com/slightfoot/00a26683ea68856ceb50e26c7d8a47d0
发布于 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
发布于 2014-05-12 20:07:18
在打开输出流之前,请尝试调用setFixedLengthStreamingMode(content length)或setChunkedStreamingMode(0)。
https://stackoverflow.com/questions/23600397
复制相似问题