建立与ftp服务器的连接——完成版(java)
// 此程序的功能是建立与ftp服务器的连接并实现文件传输
// 使用方法:java Ftp 服务器地址
//启动示例:java Ftp kiku.fuis.fukui-u.ac.jp
// 导入库
import java.net.*;
import java.io.*;
// Ftp类
public class Ftp {
// 准备
Socket ctrlSocket;//控制用Socket
public PrintWriter ctrlOutput;//控制输出用的流
public BufferedReader ctrlInput;// 控制输入用的流
final int CTRLPORT = 21 ;// ftp 的控制用端口
// openConnection方法
//由地址和端口号构造Socket,形成控制用的流
public void openConnection(String host)
throws IOException,UnknownHostException
{
ctrlSocket = new Socket(host, CTRLPORT);
ctrlOutput = new PrintWriter(ctrlSocket.getOutputStream());
ctrlInput
= new BufferedReader(new InputStreamReader
(ctrlSocket.getInputStream()));
}
// closeConnection方法
//关闭控制用的Socket
public void closeConnection()
throws IOException
{
ctrlSocket.close() ;
}
// showMenu方法
// 输出ftp的命令菜单
public void showMenu()
{
System.out.println(">Command?") ;
System.out.print("2 ls") ;
System.out.print(" 3 cd") ;
System.out.print(" 4 get") ;
System.out.print(" 5 put") ;
System.out.print(" 6 ascii") ;
System.out.print(" 7 binary") ;
System.out.println(" 9 quit") ;
}
// getCommand方法
// 读取用户指定的命令序号
public String getCommand()
{
String buf = "" ;
BufferedReader lineread
= new BufferedReader(new InputStreamReader(System.in)) ;
while(buf.length() != 1){// 循环接收一个字符的输入
try{
buf = lineread.readLine() ;
}catch(Exception e)
{
e.printStackTrace();
System.exit(1);
}
}
return (buf) ;
}
// doLogin方法
// 登录到ftp服务器
public void doLogin()
{
String loginName = "" ;
String password = "" ;
BufferedReader lineread
= new BufferedReader(new InputStreamReader(System.in)) ;
try{
System.out.println("请输入用户名") ;
loginName = lineread.readLine() ;
// 利用USER命令登录
ctrlOutput.println("USER " + loginName) ;
ctrlOutput.flush() ;
// 利用PASS命令输入口令
System.out.println("请输入口令") ;
password = lineread.readLine() ;
ctrlOutput.println("PASS " + password) ;
ctrlOutput.flush() ;
}catch(Exception e)
{
e.printStackTrace();
System.exit(1);
}
}
// doQuit方法
// 从ftp服务器注销
public void doQuit()
{
try{
ctrlOutput.println("QUIT ") ;// 发送QUIT命令
ctrlOutput.flush() ;
}catch(Exception e)
{
e.printStackTrace();
System.exit(1);
}
}
// doCd方法
// 切换目录
public void doCd()
{
String dirName = "" ;
BufferedReader lineread
= new BufferedReader(new InputStreamReader(System.in)) ;
try{
System.out.println("请输入目录名") ;
dirName = lineread.readLine() ;
ctrlOutput.println("CWD " + dirName) ;// CWD命令
ctrlOutput.flush() ;
}catch(Exception e)
{
e.printStackTrace();
System.exit(1);
}
}
// doLs方法
// 取得目录信息
public void doLs()
{
try{
int n ;
byte[] buff = new byte[1024] ;
// 建立数据连接
Socket dataSocket = dataConnection("LIST") ;
// 准备读取数据用的流
BufferedInputStream dataInput
= new BufferedInputStream(dataSocket.getInputStream()) ;
// 读取目录信息
while((n = dataInput.read(buff)) > 0){
System.out.write(buff,0,n) ;
}
dataSocket.close() ;
}catch(Exception e)
{
e.printStackTrace();
System.exit(1);
}
}
// dataConnection方法
// 构造与服务器交换数据用的Socket
// 再用PORT命令将端口通知服务器
public Socket dataConnection(String ctrlcmd)
{
String cmd = "PORT " ; //PORT存放用PORT命令传递数据的变量
int i ;
Socket dataSocket = null ;// 传送数据用Socket
try{
// 得到自己的地址
byte[] address = InetAddress.getLocalHost().getAddress() ;
// 用适当的端口号构造服务器
ServerSocket serverDataSocket = new ServerSocket(0,1) ;
// 准备传送PORT命令用的数据
for(i = 0; i