FTPライブラリを使用してファイルを転送するアプリケーションがあります。ファイルの受信はうまく機能し、ほとんどの場合ファイルの送信も機能します。この問題は、アプリケーションがハングする大きなファイル(3 MB)を送信しようとしたときに発生します。エラーメッセージも何もありません。デバッグしたところ、のsocketWrite0()
メソッドで停止することがわかりましたjava.net.SocketOutputStream
。このメソッドは決して戻りませんが、ハング/ブロックするだけです。呼び出し元:
ファイルの転送が開始されますが、2回目は転送スレッドが停止し、socketWrite0()メソッドに到達するとハングします。コンストラクターでパラメーターを送信してBufferedOutputStreamのバッファーサイズを調整しようとしましたが、このサイズは関係ないようで、常に2回目のフラッシュで停止します。
java.io.BufferedOutputStream write() which calls
java.io.BufferedOutputStream flushBuffer() which calls
java.net.SocketOutputStream write() which calls
java.net.SocketOutputStream socketWrite() which calls
java.net.SocketOutputStream socketWrite0()java.io.BufferedOutputStream flushBuffer()
次に、SocketsetSendBufferSizeを3000 000に設定しようとしましたが、突然、BufferedOutputStreamサイズがデフォルトで、すべてが正常に機能しました。このバッファサイズをファイルサイズよりも大きいサイズに設定している限り、ファイルは転送され、すべてが正常です。バッファサイズを400000に設定すると、この量が転送された後に転送が停止します。
BufferedOutputStreamバッファーを無制限に増やすことはできません。これを大きく設定しすぎると、同じことが起こります。アプリケーションがsocketWrite0()でハングします。
- 誰かが理由を説明できますか?
- ソケットバッファサイズはどのくらい大きくできますか?制限は何ですか?
- BufferedOutputStreamバッファーとSocketバッファーはどのように関連していますか?
どうもありがとうございます!