I will be waiting for your knock ever after from today.


Visards, Inc.

Java Sticky Note

java
  ・JSTL
  ・Commons Net
  ・Apache
  ・Tomcat
  ・James
  ・Jetspeed
  ・POI
  ・Jexl
  ・Jelly
  ・Blojsom
  ・eclipse

link
  ・James

author
  ・profile

Commons  
<< prev | Index | next >>
Jakarta Commonsによるネットワークプログラミング

mixiチェック

4. FTP
まずは,FTPのクライアントプログラミングから見 ていくことにします.
ご存知の通り,FTPは,インターネット上でファイ ルを転送するためのプロトコルです(RFC959).コン トロールコネクションと,データコネクションという 2つの接続を持つ点がFTPプロトコルの特徴ですが, 基本的なプロトコルの構造は次に紹介するTelnet同 様,ASCIIコードをベースとしたリクエストコマンド とレスポンスにより成り立ってます.
Commons Netで提供されているクラスの構造が, 図1です.

    図1 FTPのクラス関係

SocketClientクラスは,Commons Netで 提供されているほとんどのクライアントプログラムの 基となるクラスで,接続やタイムアウトの設定などソ ケットの低レベルな処理を実行します.
FTPクラスは,FTPプロトコル上のコマンドとほぼ 1対1の機能を提供するFTPクライアントのためのク ラスです.前述の通り,FTPプロトコルはTelnet同様 のASCIIコードのコマンドとレスポンスで成り立って おり,FTPクラスはTelnet関連のクラスを継承する形 で実装されています.
FTPClientクラスは,FTPクラスに高レベルなAPI を追加します.Commons Netを使用してFTPクライア ントを作成する上で中心的な役割を果たすのが,この FTPClientクラスです.
次は,サンプルプログラムを通して,実際のプログ ラミング方法を見ていきます.

4.1 FTPサンプルプログラムの動作
ここで挙げるサンプルプログラムは,FTPサーバに 接続し,指定されたファイルをサーバから1つ取り出 してローカルファイルとして保存し,終了するだけの ごく単純なものです.コマンドラインから,この処理 と同じ処理を実行した場合の例を図2に示します.
このプログラムをもとに,逆にファイルを送信する 場合や,ディレクトリを作成したり,ファイル情報を 取得するためのプログラミング方法についても説明し ます.

    図2 FTP コマンド実行例
    $ ftp localhost
    Connected to localhost.
    220 hostname FTP server ready.
    Name (localhost:username): <user_name>
    331 Password required for <user_name>.
    Password: <password>
    230 User <user_name> logged in.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> bin
    200 Type set to I.
    ftp> get filename
    200 PORT command successful.

    226 Transfer complete.
    ftp> quit
    221 Goodbye.

4.2 プログラムの説明
図2と同じ処理を,Commons Netを使用して作成 したプログラムがリスト1です.前述の通り,FTPク ライアントの実装で中心的な役割を果たすのが FTPClientクラスです.接続,認証,ファイルの転送 やその他のオプション機能は,このFTPClientクラス を介して実行します.

リスト1
 1  import java.io.*;
 2  import org.apache.commons.net.ftp.FTP;
 3  import org.apache.commons.net.ftp.FTPClient;
 4  import org.apache.commons.net.ftp.FTPReply;
 5  
 6  public class FTPSample {
 7  
 8      public static void main(String[] arg) throws Exception {
 9  
10          FileOutputStream ostream = null;
11  
12          // FTPClientの生成
13          FTPClient ftpclient = new FTPClient();            ←(1)
14  
15          try {
16              // サーバに接続
17              ftpclient.connect( "server_name" );           ←(2)
18              int reply = ftpclient.getReplyCode();         ←(2)
19              if (!FTPReply.isPositiveCompletion(reply)) {  ←(2)
20                  System.err.println("connect fail");       ←(2)
21                  System.exit(1);                           ←(2)
22              }                                             ←(2)
23  
24              // ログイン
25              if (ftpclient.login("user", "password") == false) {  ←(3)
26                  System.err.println("login fail");                ←(3)
27                  System.exit(2);                                  ←(3)
28              }                                                    ←(3)
29  
30              // バイナリモードに設定
31              ftpclient.setFileType(FTP.BINARY_FILE_TYPE);         ←(4)
32  
33              // ファイル受信
34              ostream = new FileOutputStream("localfile");         ←(5)
35              ftpclient.retrieveFile("remotefile", ostream);       ←(5)
36          }
37          catch(Exception e) {
38              e.printStackTrace();
39          }
40          finally {
41  
42              if (ftpclient.isConnected()) ftpclient.disconnect();  ←(6)
43  
44              if (ostream != null) {
45                  try {
46                      ostream.close();
47                  } catch(Exception e) {
48                      e.printStackTrace();
49                  }
50              }
51          }
52      }
53  }


リスト1の処理内容は以下の通りです((1)がリスト 1-(1)の部分に対応.以下同様).

(1) FTPClientオブジェクトの生成
FTPClientクラスは,クライアントプログラ ムを実装する上で中心的役割を果たすクラス です.サーバとのやり取りは,基本的にこの クラスを介して行うことになります.リスト1 - qで,FTPClientオブジェクトを生成してい ます.

(2) サーバへの接続
サーバに接続するためには,FTPClientオブ ジェクトのconnect()メソッドを使用します. 引数にサーバのホスト名を指定します.
getReplyCode()メソッドにより,接続の応答 コードを取得することができます.このコー ドが処理の成功を示しているかどうかは, FTPReply.isPositiveCompletion()メソッドで 調べることができます.FTPサーバからの応 答コードは3桁で,200番台が処理の成功を示 すコードです. FTPReply.isPositive Completion()メソッドは,応答コードが200 番台かどうかを調べて応答を返します.

(3) ログイン
接続に成功したら, ログインします. FTPClientのlogin()メソッドに,ユーザIDと パスワードを指定してログインします.ログ インに成功したかどうかは,メソッドの戻り 値で確認することができます.
FTPプロトコル上は,ユーザIDの送信はUSERコ マンド,パスワードの送信はPASSコマンドにより実 現されます.FTPクラスを直接使用する場合には,こ れらの手順でプログラミングする必要がありますが, FTPClientクラスには,これを一度に実現する高レベ ルなAPIとしてlogin()メソッドが用意されています.

(4)ファイル転送モードの設定
ファイルをバイナリモードで転送することを指定し ます.バイナリモードは,送受信するデータがバイナ リであり,何らかのコード変換が必要ないことを示し ます.バイナリモードに対するほかの転送モードには, アスキーモードなどがあります.アスキーモードは, ファイルが転送されるときに必要に応じて改行コード が変換されます.UNIX-Windows間でテキストファイ ルを転送するときなどに指定されます.デフォルトで は,アスキーモードとなります.

(5) ファイルの取得
ファイルを取得するためには,出力ストリームを FTPClientオブジェクトのretrieveFile()メソッドに渡 します.最初の引数は取得するリモートサーバ上のフ ァイル名,2番目の引数は取得したファイルのデータ を出力する出力ストリームです.これにより,リモー トサーバから取得したファイルの内容が,出力ストリ ームに書き出されます.サンプルプログラムでは FileOutputStreamを使用していますので,ローカルマ シン上のファイルに出力されます.

(6) 切断
ログアウトし,ネットワークを切断します.

4.3 その他の処理
A)ファイルの転送処理
サンプルプログラムでは,ファイルの取得処理を行 いました.転送処理を行う場合のプログラムは次のよ うになります.
FileInputStream istream =
    new FileInputStream(local_file);
ftpclient.storeFile(remote_file, istream);
close(istream);
この処理は,ローカルファイルをリモートサーバに 転送するものです.FTPClientのstoreFile()メソッド の最初の引数にリモートサーバのファイル名,第2引 数にローカルファイルの入力ストリームを指定します.

B)リモートファイルのファイル一覧の取得
リモートサーバ上の特定ディレクトリに存在するフ ァイルの一覧は,listName()メソッドで取得できま す.
String[] flist = ftpclient.listNames(path);
for(int i=0; i<flist.length; i++) {
    System.out.println(flist[i]);
}
引数には,ファイル一覧を取得するリモートサーバ 上のパスを文字列で指定します.

C)ファイル情報の取得
リモートサーバ上にあるファイルの情報を取得する ためには,listFiles()メソッドを使用します.
FTPFile[] list = ftpclient.listFiles(path);
for (int i=0; i<list.length; i++) {
    String name = list[i].getName();
    String group = list[i].getGroup();
    java.util.Calendar calendar
        = list[i].getTimestamp();
        :
}
上記例ではファイルのファイル名,グループ,タイ ムスタンプを取得しています.それ以外に,ファイル のオーナやファイルタイプ(ファイルかディレクトリ か),ファイルのパーミッションなども取得できます.

D)ディレクトリ作成・削除
ディレクトリの作成にはFTPClient のmakeDirectory()メソッド, 削除にはremoveDirectory() メソッド,ファイルの削除にはdeleteFile()を使用し ます.また,ファイル名の変更のために,rename() メソッドが用意されています.以下は,ディレクトリ を作成する場合の例です.

ftpclient.makeDirectory("/pub/test_directory");

E)ファイルのパーミッション変更
FTPプロトコルには,ファイルのパーミッションを 変更するためのプロトコルは用意されていません.特 殊なコマンドを送信するための手段としてFTPプロト コルでは,SITEコマンドが用意されています.UMASK の設定や,ファイルのパーミッション変更は,この SITEコマンドを用いて実行することになります.た だし,SITEコマンドで何が可能かはFTPサーバの設 定や種類により異なります.SITEコマンドの実行は, FTPClientのsite()メソッドを使用します.





 << prev  ↑index  next >>


このドキュメントに関するご意見、ご要望などはまで。


Copyright (C) 2003-2005 Visards, Inc. All Rights Reserved.