今回は、二つのファイルに分けました。
//////////////////// jftp.java ////////////////////
class jftp
{
public static void main(String args[])
{
if(args.length < 4)
{
Usage();
}
new FTPClient(args[0],args[1],args[2],args[3]);
}
// 引数が足りない時に、使い方を表示する。
public static void Usage()
{
System.err.println("Usage:java jftp URL UserName Password type");
System.err.println("URL:(ex)http://www.yahoo.co.jp/index.html");
System.err.println("type:Ascii or Binary");
System.exit(-1);
}
}
////////////////////////////////////////////////////////////
//////////////////// FTPClient.java ////////////////////
import java.net.*;
import java.util.StringTokenizer;
import java.io.*;
class FTPClient
{
// 受信コード
public static final String READY = "220";
public static final String USER = "331";
public static final String PASS = "230";
public static final String COMMAND = "200";
public static final String OPEN = "150";
public static final String TRANSFER = "226";
// 定数
public static final char return_code = 0x0a;
public static final int client_port = 1094;
// メッセージ送受信用I/Oストリーム
BufferedReader input;
DataOutputStream output;
// Publicメンバ変数
URL url;
String user_name;
String password;
String type;
String file_name;
int ip[];
// コンストラクタ
public FTPClient(String param_url,String user_name,String password,String type)
{
this.user_name = user_name;
this.password = password;
this.type = type;
connection(param_url);
}
// FTPコネクション
public void connection(String param_url)
{
try
{
url = new URL(param_url);
// IPアドレスの取得
int index = 0;
ip = new int[4];
StringTokenizer string;
Socket socket = new Socket(url.getHost(),21);
InetAddress ipaddress = InetAddress.getLocalHost();
string = new StringTokenizer(ipaddress.getHostAddress(),".");
while(string.hasMoreTokens())
{
ip[index] = Integer.parseInt(string.nextToken());
index++;
}
// ファイル名の解析
string = new StringTokenizer(url.getFile(),"/");
String file_name = new String();
while(string.hasMoreTokens())
{
file_name = string.nextToken();
}
// 送受信用リスナ
ServerSocket ssocket = new ServerSocket(client_port);
// メッセージ送受信用I/Oストリームの取得
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
output = new DataOutputStream(socket.getOutputStream());
// FTP 通信の開始
ReceiveMessage(READY);
UserAuthentication(user_name,password);
SetType(type);
OpenClientPort(ip,client_port);
int file_size = ReceiveFile(url.getFile().substring(1));
// 受信用リスナの構築
Socket receive = ssocket.accept();
DataInputStream data_in = new DataInputStream(receive.getInputStream());
DataOutputStream file_out = new DataOutputStream(new FileOutputStream(file_name));
// 受信&書き出し
String str;
for(int i=0;i<file_size;i++)
{
file_out.writeByte(data_in.readByte());
}
ReceiveMessage(TRANSFER);
// 終了処理
socket.close();
ssocket.close();
}
catch(Exception e)
{
System.err.println(e.toString());
}
}
// リターンコードの確認
protected boolean isReady(String string,String type)
{
if(string.substring(0,3).compareTo(type) == 0)
{
return(true);
}
return(false);
}
// エラーメッセージルーチン
protected void ErrorMessage(String message)
{
System.err.println(message);
System.exit(-1);
}
// メッセージの送信
protected void SendMessage(String message)
{
try
{
output.writeBytes(message + return_code);
}
catch(IOException e)
{
System.err.println(e.toString());
}
}
// 受信メッセージの判断
protected String ReceiveMessage(String type)
{
try
{
String res = input.readLine();
System.out.println(">" + res);
if(!isReady(res,type))
{
ErrorMessage("Error: code = " + type);
}
return(res);
}
catch(IOException e)
{
System.out.println(e.toString());
return("Error_Code");
}
}
// ユーザー認証
protected void UserAuthentication(String user_name,String password)
{
SendMessage("USER " + user_name);
ReceiveMessage(USER);
SendMessage("PASS " + password);
ReceiveMessage(PASS);
}
// Ascii or Binaryモードセット
protected void SetType(String type)
{
if(type.toLowerCase().compareTo("ascii") == 0)
{
SendMessage("TYPE A");
ReceiveMessage(COMMAND);
}
else
{
SendMessage("TYPE I");
ReceiveMessage(COMMAND);
}
}
// データ受信用ポートの通知
protected void OpenClientPort(int ip[],int port)
{
int high_port_number,low_port_number;
high_port_number = port / 256;
low_port_number = port % 256;
SendMessage("PORT " + ip[0] + "," + ip[1] + "," + ip[2] + "," + ip[3] + ","
+ high_port_number + "," + low_port_number);
ReceiveMessage(COMMAND);
}
// ファイル受信コマンド
protected int ReceiveFile(String file_name)
{
String receive;
SendMessage("RETR " + file_name);
receive = ReceiveMessage(OPEN);
return(GetFileSize(receive));
}
// ファイル送信コマンド
protected int StoreFile(String file_name)
{
String receive;
SendMessage("STOR " + file_name);
receive = ReceiveMessage(OPEN);
return(GetFileSize(receive));
}
// 受信/送信メッセージからファイルサイズを求める
protected int GetFileSize(String message)
{
int size,begin_index,end_index;
begin_index = message.lastIndexOf('(') + 1;
end_index = message.lastIndexOf("bytes") - 1;
size = Integer.parseInt(message.substring(begin_index,end_index));
return(size);
}
}
////////////////////////////////////////////////////////////
Source is here. (ZIP Format,2250Byte,Shift-JIS)