2000年3月28日星期二

FTP編


◆FTPとは?
FTPとはFile Transfer
Protocol
の略です。TCP/IPネットワークでファイルを転送するときに使用されるプロトコルです。
◆ここでの環境
OS Windows 2000
J2SE SDK 1.4.0
◆Java実行環境の構築
アプリケーション編を参考にしてJava実行環境を構築してください。
◆Javaソースコード
ここでは、FTPサーバーにファイルを転送する簡単なアプリケーションを作成したいと思います。
HelloWorldFTP.java(ここからダウンロード)
import java.io.*;
import java.net.*;

public class HelloWorldFTP {
  private static final int CTRLPORT  = 21; // ftpの制御用のポート
  private static Socket ctrlSocket; // 制御用ソケット
  private static PrintWriter ctrlOutput; // 制御出力用ストリーム
  private static BufferedReader ctrlInput; // 制御入力用ストリーム
  private static byte[] localHostAddress; // ローカルホストのアドレス

  public static void main(String[] args) {
    try {
      /** 設定してください **/
      String host = "192.168.1.1";
      String loginName = "testuser";
      String password = "password";
      String dirName = "/home/testuser";
      String fileName = "hello.zip";

      // 接続します
      ctrlSocket = new Socket(host, CTRLPORT);
      localHostAddress = ctrlSocket.getLocalAddress().getAddress();
      ctrlOutput = new PrintWriter(ctrlSocket.getOutputStream());
      ctrlInput = new 
        BufferedReader(new InputStreamReader(ctrlSocket.getInputStream()));
      // ユーザー認証します
      ctrlOutput.println("USER " + loginName);
      ctrlOutput.flush();
      ctrlOutput.println("PASS " + password);
      ctrlOutput.flush();
      // 指定したディレクトリに移動します
      ctrlOutput.println("CWD " + dirName);
      ctrlOutput.flush();
      // バイナリモードに設定します(アスキーモードの場合は'TYPE A')
      ctrlOutput.println("TYPE I");
      ctrlOutput.flush();
      // アップロードします
      FileInputStream fis = new FileInputStream(fileName);
      Socket dataSocket = dataConnection("STOR " + fileName);
      OutputStream outstr = dataSocket.getOutputStream();
      int n;
      byte[] buff = new byte[1024];
      while ((n = fis.read(buff)) > 0) {
        outstr.write(buff,0,n);
      }
      dataSocket.close();
      fis.close();

      // 接続を閉じます
      ctrlOutput.close();
      ctrlInput.close();
      ctrlSocket.close();
    }catch (Exception e) {
      e.printStackTrace();
    }
  }
  /**
   * データ送受信用ソケットを取得します
   */
  private static Socket dataConnection(String ctrlcmd) 
      throws IOException,UnknownHostException {
    String cmd = "PORT ";
    ServerSocket serverDataSocket = new ServerSocket(0,1);
    for (int i=0;i<4;i++) {
      cmd = cmd + (localHostAddress[i] & 0xff) + ",";
    }
    cmd = cmd + (((serverDataSocket.getLocalPort())/256) & 0xff)
              + ","
              + (serverDataSocket.getLocalPort() & 0xff);

    ctrlOutput.println(cmd);
    ctrlOutput.flush();
    ctrlOutput.println(ctrlcmd);
    ctrlOutput.flush();

    Socket dataSocket = serverDataSocket.accept();
    serverDataSocket.close();
    return dataSocket;
  }
}
 
(注意)

「ホスト名」、「ユーザー名」、「パスワード」、「アップロードするディレクトリ」、「アップロードするファイル」は環境に合わせて設定してください。
◆転送するファイルの用意
転送するファイルをJavaのプログラムがあるディレクトリに置きます。ここでは「hello.zip」を置きました。
◆コンパイルと実行
コマンドプロンプト
C:\作業フォルダ\JavaHello>javac
HelloWorldFTP.java

C:\作業フォルダ\JavaHello>java
HelloWorldFTP

C:\作業フォルダ\JavaHello>

どうやらうまく動いたみたいです。さっそくサーバーにファイルが転送されているか見てみましょう。
Telnet
# cd /home/testuser

# ls

hello.zip

#
おおおお!!ファイルが転送されていますね!

没有评论:

发表评论