www.pudn.com > networktools.rar > FtpClientFrame.java


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;                            // FtpClient对象
  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 java.awt.event.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 java.awt.event.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(128, 412, 230, 22));

    buttonDownload.setLabel("下载");
    buttonDownload.setBounds(new Rectangle(375, 412, 70, 22));
    buttonDownload.addActionListener(new java.awt.event.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("连接主机:"+textFieldHost.getText()+"成功!");
    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 msg = new JOptionPane();                     // 提示对话框
      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();
  }
}