需要用到JAVA API提供的FtpClient,TelnetInputStream,RandomAccessFile等几个类. (1)FtpClient类 负责客户端与服务器端的通讯,实现了客户端FTP传输的功能. (2)TelnetInputStream类 负责辅助完成FTP的传输,是一种输入流类 (3)RandomAccessFile类 文件随机访问 下面实现一个FTP客户端程序,用来下载FTP服务端的文件,实现步骤如下: (1)输入服务器名以及用于登录的用户名和密码,登录FTP服务器 (2)登录成功后,列出服务器端的目录和文件名 (3)选择要下载的文件和存储的本机目录完成文件下载 创建一个包含main()方法的客户端FtpClientFrame类
package ftpclient;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import sun.net.ftp.*;
import sun.net.*;
import java.io.*;
public class FtpClientFrame extends JFrame{
JPanel contentPane;
Label labelPrompt=new Label();
Label labelHost=new Label();
TextField textFieldHost=new TextField();
Label labelUser=new Label();
TextField textFieldUser=new TextField();
Label labelPassword=new Label();
TextField textFieldPassword=new TextField();
Button buttonLink=new Button();
Button buttonDisconnect=new Button();
Label labelFileShow=new Label();
TextArea textAreaContent=new TextArea();
Label labelFile=new Label();
TextField textFieldFile=new TextField();
Label labelDir=new Label();
TextField textFieldDir=new TextField();
Button buttonDownload=new Button();
FtpClient myFtp=null;
TelnetInputStream inStream=null;
public FtpClientFrame(){
try{
jbInit();
}
catch(Exception e){
e.printStackTrace();
}
}
private void jbInit() throws Exception{
contentPane=(JPanel)this.getContentPane();
contentPane.setLayout(null);
labelPrompt.setBounds(new Rectangle(25,6,180,22));
labelHost.setText("主机名");
labelHost.setBounds(new Rectangle(25,38,50,22));
textFieldHost.setBounds(new Rectangle(78,38,280,22));
labelUser.setText("用户名");
labelUser.setBounds(new Rectangle(25,70,50,22));
textFieldUser.setBounds(new Rectangle(78,70,114,22));
labelPassword.setText("密码:");
labelPassword.setBounds(new Rectangle(205,70,37,22));
textFieldPassword.setBounds(new Rectangle(244,70,114,22));
textFieldPassword.setEchoChar('*');
buttonLink.setLabel("连接");
buttonLink.setBounds(new Rectangle(375,38,70,22));
buttonLink.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
buttonLink_actionPerformed(e);
}
});
buttonLink.setEnabled(true);
buttonDisconnect.setLabel("断开");
buttonDisconnect.setBounds(new Rectangle(375,70,70,22));
buttonDisconnect.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
buttonDisconnect_actionPerformed(e);
}
});
buttonDisconnect.setEnabled(false);
labelFileShow.setText("目录列表");
labelFileShow.setBounds(new Rectangle(25,105,140,22));
textAreaContent.setBounds(new Rectangle(25,135,420,235));
textAreaContent.setEditable(false);
labelFile.setText("欲下载的文件");
labelFile.setBounds(new Rectangle(25,380,100,22));
textFieldFile.setBounds(new Rectangle(128,380,230,22));
labelDir.setText("存放文件的路径");
labelDir.setBounds(new Rectangle(25,412,100,22));
textFieldDir.setBounds(new Rectangle(1285,412,230,22));
buttonDownload.setLabel("下载");
buttonDownload.setBounds(new Rectangle(375,412,70,22));
buttonDownload.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
buttonDownload_actionPerformed(e);
}
});
buttonDownload.setEnabled(false);
contentPane.add(labelPrompt,null);
contentPane.add(labelHost,null);
contentPane.add(textFieldHost,null);
contentPane.add(labelUser,null);
contentPane.add(textFieldUser,null);
contentPane.add(labelPassword,null);
contentPane.add(textFieldPassword,null);
contentPane.add(buttonLink,null);
contentPane.add(buttonDisconnect,null);
contentPane.add(labelFileShow,null);
contentPane.add(textAreaContent,null);
contentPane.add(textFieldFile,null);
contentPane.add(labelFile,null);
contentPane.add(labelDir,null);
contentPane.add(textFieldDir,null);
contentPane.add(buttonDownload,null);
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
this.setSize(new Dimension(480,485));
this.setResizable(false);
this.setTitle("ftp客户端");
this.setVisible(true);
}
void buttonLink_actionPerformed(ActionEvent e){
String hostname=textFieldHost.getText();
labelPrompt.setText("正在连接...");
try{
myFtp=new FtpClient(hostname);
myFtp.login(textFieldUser.getText(), textFieldPassword.getText());
myFtp.binary();
showFileContents();
}
catch(FtpLoginException e1){
String strPrompt="用户名密码错误";
labelPrompt.setText(strPrompt);
}
catch(IOException e1){
String strPrompt="连接主机"+hostname+"失败";
labelPrompt.setText(strPrompt);
}
catch(SecurityException e1){
String strPrompt="无权限与主机:"+hostname+"连接";
labelPrompt.setText(strPrompt);
}
labelPrompt.setText("连接主机:"+hostname+"成功");
buttonDisconnect.setEnabled(true);
buttonDownload.setEnabled(true);
buttonLink.setEnabled(false);
}
void buttonDisconnect_actionPerformed(ActionEvent e){
try{
myFtp.closeServer();
textAreaContent.setText("");
labelPrompt.setText("与主机断开");
}
catch(IOException e1){
System.out.println("Error: "+e1);
}
buttonLink.setEnabled(true);
buttonDownload.setEnabled(false);
buttonDisconnect.setEnabled(false);
}
public void showFileContents(){
int ch;
StringBuffer buf=new StringBuffer();
try{
inStream=myFtp.list();
while((ch=inStream.read())>=0){
buf.append((char)ch);
}
textAreaContent.append(buf.toString());
inStream.close();
}
catch(Exception e){
System.out.println("Error: "+e);
}
}
void buttonDownload_actionPerformed(ActionEvent e){
int ch;
StringBuffer buf=new StringBuffer();
buf.setLength(0);
try{
File dir=new File(textFieldDir.getText());
File f=new File(dir,textFieldFile.getText());
RandomAccessFile file=new RandomAccessFile(f,"rw");
inStream=myFtp.get(textFieldFile.getText());
while((ch=inStream.read())>=0){
buf.append((char)ch);
}
file.writeBytes(buf.toString());
file.close();
JOptionPane.showMessageDialog(FtpClientFrame.this, "下载成功","下载成功!",1);
}
catch(Exception e1){
System.out.println("Error:"+e1);
}
}
protected void processWindowEvent(WindowEvent e){
super.processWindowEvent(e);
if(e.getID()==WindowEvent.WINDOW_CLOSING){
try{
if(inStream!=null)
inStream.close();
}
catch(IOException e1){
System.out.println("Error: "+e1);
}
System.exit(0);
}
}
public static void main(String[] args){
new FtpClientFrame();
}
}