7

画像のアップロードの進行状況を公開しようとしています。クライアントとして okhttp を使用してアップロードし、mimecraft を使用してマルチパート ファイルをパッケージ化します。

データがソケットに書き込まれたときにバイトカウントを書き込むログを追加し (正しく判断できる場合は 4kb のチャンクで)、アップロードしました。

問題は、データのチャンクが書き込まれるたびに出力ストリームでフラッシュを呼び出すと、出力ストリームに約 800kb が書き込まれるまで何もアップロードされないように見えることです。そのポイントに達すると、最大 100kb をアップロードするように見え、アプリはさらに 100kb を出力ストリームに書き込み (解放されたスペースのように、もう少し書き込める)、続行します。

この結果、(1.2MB のファイルで) 最初の 800KB がほぼ瞬時に書き込まれ/報告され、次にアップロードが開始され (Charles ネットワーク ソフトウェアを介して追跡されます)、次のファイルで 100KB の読み取り/書き込み/アップロードが開始されます。数秒後、最後のバイトが出力ストリームに書き込まれると、アプリはアップロードの 100% が書き込まれたことを報告します。ただし、ネットワーク クライアントはまだネットワーク バッファにある最後の 800kb をアップロード中であり、それをアップロードするためにさらに 5 ~ 10 秒間そこに留まり、その後リクエストを終了するため、これは当てはまります。

誰かがこの経験をしたことがありますか、またはこれがokhttpで一般的な問題であるかどうかを知っていますか?

乾杯

編集: 800kb 未満のファイルをアップロードする場合、250kb と 500kb をいくつかテストしましたが、それらはすべて、アップロードされる前にすぐにストリームに 100% 書き込まれますが、3 MB の画像でも 800 kb がアップロードされ、約 100 kb のチャンクに分割されます。 、書き込みループがそこにあり、アップロードされるたびに別の 100kb を書き込みます。

4

3 に答える 3

1

ソケット送信バッファがデフォルトで高い値に設定されており、フラッシュが接続されていません。Java ソケットを同期する方法を見つけようとして失敗しました。デフォルトのソケット 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)orを呼び出してみてください。setChunkedStreamingMode(0)

于 2014-05-12T12:07:18.217 に答える