2

非標準のFTPコマンドを特定のサーバー(それらを受け入れる)に送信する必要があるため、apachecommonsを使用して手動のFTPコマンドを送信しようとしています。

これらの非標準コマンドを送信する前に、commons.net.ftpを使用してFTPを手動で動作させたいと思います。残念ながら、何かが足りないようです。

これは正常に機能します(つまり、ファイルのリストを取得します)

FTPClient ftp = new FTPClient();
FTPClientConfig config = new FTPClientConfig();
ftp.configure(config);

ftp.connect("ftp.mozilla.org");
ftp.login("anonymous", "");

ftp.enterLocalPassiveMode();
FTPFile[] fileList = ftp.listFiles("/");

これはしません

FTPClient ftp = new FTPClient();
FTPClientConfig config = new FTPClientConfig();
ftp.configure(config);

ftp.connect("ftp.mozilla.org");
ftp.login("anonymous", "");

ftp.sendCommand("PASV");
ftp.sendCommand("NLST");

私は適切な応答を受け取りますが、最終的に私に与えることftp.sendCommand("PASV");でタイムアウトになりますftp.sendCommand("NLST");

425 Failed to establish connection.

私はこのトピックを調査しようとしましたが、このエラーに関するほとんどのアドバイスは、サーバーをセットアップする人向けです(通常はファイアウォールの問題です)。

net.ftpコマンドを手動で送信したときに機能しないのに、なぜ機能するのですか?

4

1 に答える 1

0

コマンドを手動で送信するPASVだけでは不十分です。クライアントは、PASVコマンドに応答して、サーバーによって指定されたポートへのデータ接続を開く必要があります。これは、メソッドを呼び出すことによって実行されenterLocalPassiveMode()ます。手動で送信PASVするとデータ接続が初期化されないため、直後にエラーが発生します。

FTP プロトコルの詳細については、http://slacksite.com/other/ftp.html#passiveを参照してください。

于 2013-03-19T10:42:34.777 に答える