3

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()でハングします。

  1. 誰かが理由を説明できますか?
  2. ソケットバッファサイズはどのくらい大きくできますか?制限は何ですか?
  3. BufferedOutputStreamバッファーとSocketバッファーはどのように関連していますか?

どうもありがとうございます!

4

1 に答える 1

0

反対側がソケットから読み取っていないように聞こえるので、ソケットがブロックされています。反対側(ソケットから読み取ることになっている側)を書き込んだ場合、問題はそのコードにある可能性があります。そうではなく、FTP標準を実装して、動作している既知のFTPサーバーと通信しようとしている場合は、クライアント側での実装方法に問題がある可能性が高くなります(たとえば、ファイルデータを書き込もうとしているが、リモート側はそれを期待しておらず、制御メッセージか何かを期待しています)。

于 2012-10-24T23:39:42.677 に答える