2016-04-12 11 views
1

私はApache FTPSクライアントを作成しています(リモートサーバーはプレーンなFTPを許可しないため)。問題なくファイルを接続および削除できますが、retrieveFile()またはretrieveFileStream()を使用すると、ファイルはハングします。FTPSClient retrievefile()hang

何らかの理由で、非常に小さなファイルが(5792バイトまで)転送を行うが、何か他のものは、次のPrintCommandListener出力が得られます。

実行:
220 ----------ようこそPure-FTPd [privsep] [TLS] ----------
220 - あなたはユーザー番号2の50を使用できます。
220-現地時間は19:42になりました。サーバーポート:21.
220-これはプライベートシステムです。匿名ログインはありません。
このサーバーでは、220-IPv6接続も可能です。
220 15分を過ぎると切断されます。
AUTH TLS
234 AUTH TLS OK。
ユーザー
331ユーザーOKです。パスワードが必要です
PASS
230 OKです。 (||| 53360 |)
RETR test.txtの
150-受け付けたデータ接続
150 7.3現在の制限されたディレクトリが
200 TYPEはASCIIになりました
EPSV
229拡張パッシブモードOK/
TYPEですここで

をダウンロードするキロバイトのコードです:

try { 

    FTPSClient ftpClient = new FTPSClient("tls",false); 

    ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out))); 

    ftpClient.connect(host, port); 

    int reply = ftpClient.getReplyCode(); 

    if (FTPReply.isPositiveCompletion(reply)) { 
     ftpClient.enterLocalPassiveMode(); 
     ftpClient.login(username, password); 
     ftpClient.enterLocalPassiveMode(); 
     FileOutputStream outputStream = new FileOutputStream(tempfile); 
     ftpClient.setFileType(FTPClient.ASCII_FILE_TYPE); 
     ftpClient.retrieveFile("test.txt", outputStream); 
     outputStream.close(); 
     ftpClient.logout(); 
     ftpClient.disconnect(); 
    } 
} catch (IOException ioe) { 
    System.out.println("FTP client received network error"); 
} 

すべてのアイデアを大歓迎します。

+0

コードを正しくフォーマットしてください。エディタの上に用意されているツールを使用するだけで、ポイントとクリックの書式をマークすることができます。 –

答えて

0

通常FTPS接続用のFTPコマンドシーケンスは、(RFC 4217ごとに)行くAUTH TLS、​​、そしてUSERPASSなど。したがって、あなたは試してみてください:明示的

FTPSClient ftpClient = new FTPSClient("tls",false); 
ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out))); 
ftpClient.connect(host, port); 
int reply = ftpClient.getReplyCode(); 
if (FTPReply.isPositiveCompletion(reply)) { 
    ftpClient.execPBSZ(0); 
    reply = ftpClient.getReplyCode(); 
    // Check for PBSZ error responses... 
    ftpClient.execPROT("P"); 
    reply = ftpClient.getReplyCode(); 
    // Check for PROT error responses... 

    ftpClient.enterLocalPassiveMode(); 

このをデータ接続(​​)をバッファリングし、データ転送(PROT P)を保護するためにTLSを使用するにサーバーをないように指示します。

あなたはは、いくつかのバイトを転送することができであるという事実は、この問題が他の一般的なFTPS問題であるファイアウォール/ルータ/ NATとない通常の合併症で、あることを示しています。

希望すると便利です。

+0

ファイアウォールのことを半分期待していたので、これは便利です。しかし、そのコードは機能しません、ぶら下がりを防止しますが、 "FTPクライアントはネットワークエラーを受け取りました"を出力します。 –

+0

Hmm。私は 'FTPSClient'が保護されたデータ転送を期待していないのだろうかと思います。代わりに 'execPROT(" C ")'を使うとどうなりますか?これは、保護のデータ転送チャネル(テスト用)を_clear_にサーバーに伝えます。 – Castaglia

+0

'lftp'(または他のFTPSクライアント)を使ってファイルをダウンロードすることで、サーバ(とファイアウォール/ NAT /ルータ)が適切に動作しているか再度確認することもできます。 _that_が成功すると、それは正しいコードを見つけることの問題であることがわかります。それ以外の場合は、コード内に問題がない可能性があります。 – Castaglia

関連する問題