Symfoware

Symfowareについての考察blog

Java + MockFtpServerでFTPサーバー側のプログラムを作成する その2

Java + MockFtpServerでカスタムFTPサーバーを作成中です。
起動とユーザー認証まで試してみました。

Java + MockFtpServerでFTPサーバー側のプログラムを作成する その1

今回はディレクトリの表示を試してみます。



ListCommandHandler



フォルダの一覧を表示するには、ListCommandHandlerを実装します。

内容はこんな感じになりました。


  1. import org.mockftpserver.core.command.Command;
  2. import org.mockftpserver.core.command.InvocationRecord;
  3. import org.mockftpserver.core.session.Session;
  4. import org.mockftpserver.core.util.StringUtil;
  5. import org.mockftpserver.stub.command.ListCommandHandler;
  6. public class MyListCommandHandler extends ListCommandHandler {
  7.     
  8.     private static final int SIZE_WIDTH = 15;
  9.     
  10.     protected void beforeProcessData(Command command, Session session, InvocationRecord invocationRecord) throws Exception {
  11.         super.beforeProcessData(command, session, invocationRecord);
  12.         
  13.         LOG.info("---------------------------------");
  14.         LOG.info(invocationRecord.getString(PATHNAME_KEY));
  15.         
  16.         StringBuilder sb = new StringBuilder();
  17.         sb.append("2009-03-09 21:15PM");
  18.         sb.append(" ");
  19.         sb.append(StringUtil.padRight("<DIR>", SIZE_WIDTH));
  20.         sb.append(" ");
  21.         sb.append("1");
  22.         sb.append("\r\n");
  23.         
  24.         sb.append("2009-03-09 21:16PM");
  25.         sb.append(" ");
  26.         sb.append(StringUtil.padLeft("190", SIZE_WIDTH));
  27.         sb.append(" ");
  28.         sb.append("2");
  29.         sb.append("\r\n");
  30.         
  31.         setDirectoryListing(sb.toString());
  32.         
  33.         
  34.     }
  35. }




ディレクトリの場合


[日付] <DIR> [ディレクトリ名]



ファイルの場合は


[日付] [容量] [ファイル名]



という文字列を作成すればOKです。



合わせて、FileZillaなどのツールから接続する場合は、
PwdCommandHandlerの実装も必要です。


  1. import org.mockftpserver.core.command.Command;
  2. import org.mockftpserver.core.command.InvocationRecord;
  3. import org.mockftpserver.core.session.Session;
  4. import org.mockftpserver.stub.command.PwdCommandHandler;
  5. public class MyPwdCommandHandler extends PwdCommandHandler {
  6.     
  7.     public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
  8.         setDirectory("/");
  9.         super.handleCommand(command, session, invocationRecord);
  10.     }
  11. }




これが必要な理由ですが
http://www.atmarkit.co.jp/fnetwork/rensai/netpro10/ftp-responsecode.html


ファイルやディレクトリを作成したというのがRFCでの意味だが、
MKDコマンドの結果以外にも、実際にはPWDコマンドの結果にも用いられる



接続後、このコマンドが実行され、カレントディレクトリを
決定しているようでした。



メインのプログラムも、作成したハンドラーを使用するよう修正します。


  1. import org.mockftpserver.core.command.CommandNames;
  2. import org.mockftpserver.stub.StubFtpServer;
  3. public class MainProccess {
  4.     
  5.     public static void main(String... args) {
  6.         
  7.         StubFtpServer stubFtpServer = new StubFtpServer();
  8.         stubFtpServer.setServerControlPort(10021);
  9.         
  10.         stubFtpServer.setCommandHandler(CommandNames.USER, new MyUserCommandHandler());
  11.         stubFtpServer.setCommandHandler(CommandNames.PASS, new MyPassCommandHandler());
  12.         stubFtpServer.setCommandHandler(CommandNames.PWD, new MyPwdCommandHandler());
  13.         stubFtpServer.setCommandHandler(CommandNames.LIST, new MyListCommandHandler());
  14.         
  15.         stubFtpServer.start();
  16.         
  17.     }
  18. }






テスト




FileZillaで接続をテストしてみます。
狙い通りのフォルダ階層が表示されました。

524_01.png
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/01/12(月) 11:22:19|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Java + MockFtpServerでFTPサーバー側のプログラムを作成する その3 | ホーム | Java + MockFtpServerでFTPサーバー側のプログラムを作成する その1>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1581-7903b3b5
この記事にトラックバックする(FC2ブログユーザー)