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。

4

3 回答 3

3

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

所以我创建了一个套接字工厂,可以让你覆盖发送缓冲区的大小。

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

于 2016-04-19T22:37:06.387 回答
1

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

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

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

于 2014-10-13T21:26:23.807 回答
-1

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

于 2014-05-12T12:07:18.217 回答