Java语言实现简单FTP软件 FTP软件远程窗口实现(6)

本文为大家介绍了FTP软件远程窗口的实现方法,供大家参考,具体内容如下

1、首先看一下远程窗口的布局效果

2、看一下本地窗口实现的代码框架

3、远程窗口主要实现代码FtpPanel.java

package com.oyp.ftp.panel.ftp; 

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;
import java.util.logging.Level;
import java.util.logging.Logger; 

import javax.swing.ActionMap;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import javax.swing.table.TableStringConverter; 

import sun.net.TelnetInputStream;
import com.oyp.ftp.FTPClientFrame;
import com.oyp.ftp.panel.FTPTableCellRanderer;
import com.oyp.ftp.utils.FtpClient;
import com.oyp.ftp.utils.FtpFile; 

public class FtpPanel extends javax.swing.JPanel { 

 FtpClient ftpClient;
 private javax.swing.JButton createFolderButton;
 private javax.swing.JButton delButton;
 private javax.swing.JButton downButton;
 javax.swing.JTable ftpDiskTable;
 private javax.swing.JLabel ftpSelFilePathLabel;
 private javax.swing.JScrollPane scrollPane;
 private javax.swing.JToolBar toolBar;
 private javax.swing.JButton refreshButton;
 private javax.swing.JButton renameButton;
 FTPClientFrame frame = null;
 Queue<Object[]> queue = new LinkedList<Object[]>();
 private DownThread thread; 

 public FtpPanel() {
 initComponents();
 } 

 public FtpPanel(FTPClientFrame client_Frame) {
 frame = client_Frame;
 initComponents();
 } 

 private void initComponents() {
 ActionMap actionMap = getActionMap();
 actionMap.put("createFolderAction", new CreateFolderAction(this,
  "创建文件夹", null));
 actionMap.put("delAction", new DelFileAction(this, "删除", null));
 actionMap.put("refreshAction", new RefreshAction(this, "刷新", null));
 actionMap.put("renameAction", new RenameAction(this, "重命名", null));
 actionMap.put("downAction", new DownAction(this, "下载", null)); 

 java.awt.GridBagConstraints gridBagConstraints; 

 toolBar = new javax.swing.JToolBar();
 delButton = new javax.swing.JButton();
 renameButton = new javax.swing.JButton();
 createFolderButton = new javax.swing.JButton();
 downButton = new javax.swing.JButton();
 refreshButton = new javax.swing.JButton();
 scrollPane = new JScrollPane();
 ftpDiskTable = new JTable();
 ftpDiskTable.setDragEnabled(true);
 ftpSelFilePathLabel = new javax.swing.JLabel(); 

 setBorder(javax.swing.BorderFactory.createTitledBorder(null, "远程",
  javax.swing.border.TitledBorder.CENTER,
  javax.swing.border.TitledBorder.ABOVE_TOP));
 setLayout(new java.awt.GridBagLayout()); 

 toolBar.setRollover(true);
 toolBar.setFloatable(false); 

 delButton.setText("删除");
 delButton.setFocusable(false);
 delButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
 delButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
 delButton.setAction(actionMap.get("delAction"));
 toolBar.add(delButton); 

 renameButton.setText("重命名");
 renameButton.setFocusable(false);
 renameButton.setAction(actionMap.get("renameAction"));
 toolBar.add(renameButton); 

 createFolderButton.setText("新文件夹");
 createFolderButton.setFocusable(false);
 createFolderButton.setAction(actionMap.get("createFolderAction"));
 toolBar.add(createFolderButton); 

 downButton.setText("下载");
 downButton.setFocusable(false);
 downButton.setAction(actionMap.get("downAction"));
 toolBar.add(downButton); 

 refreshButton.setText("刷新");
 refreshButton.setFocusable(false);
 refreshButton.setAction(actionMap.get("refreshAction"));
 toolBar.add(refreshButton); 

 gridBagConstraints = new java.awt.GridBagConstraints();
 gridBagConstraints.gridx = 0;
 gridBagConstraints.gridy = 0;
 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
 gridBagConstraints.weightx = 1.0;
 add(toolBar, gridBagConstraints); 

 ftpDiskTable.setModel(new FtpTableModel());
 ftpDiskTable.setShowHorizontalLines(false);
 ftpDiskTable.setShowVerticalLines(false);
 ftpDiskTable.getTableHeader().setReorderingAllowed(false);
 ftpDiskTable.setDoubleBuffered(true);
 ftpDiskTable.addMouseListener(new java.awt.event.MouseAdapter() {
  public void mouseClicked(java.awt.event.MouseEvent evt) {
  ftpDiskTableMouseClicked(evt);
  }
 });
 scrollPane.setViewportView(ftpDiskTable);
 scrollPane.getViewport().setBackground(Color.WHITE);
 //设置渲染本地资源和FTP资源表格组件的渲染器
 ftpDiskTable.getColumnModel().getColumn(0).setCellRenderer(
  FTPTableCellRanderer.getCellRanderer());
 //RowSorter 的一个实现,它使用 TableModel 提供排序和过滤操作。
 TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(
  ftpDiskTable.getModel());
 TableStringConverter converter = new TableConverter();
 //设置负责将值从模型转换为字符串的对象。
 sorter.setStringConverter(converter);
 //设置 RowSorter。RowSorter 用于提供对 JTable 的排序和过滤。
 ftpDiskTable.setRowSorter(sorter);
 /**
  * 颠倒指定列的排序顺序。调用此方法时,由子类提供具体行为。
  * 通常,如果指定列已经是主要排序列,则此方法将升序变为降序(或将降序变为升序);
  * 否则,使指定列成为主要排序列,并使用升序排序顺序。如果指定列不可排序,则此方法没有任何效果。
  */
 sorter.toggleSortOrder(0); 

 gridBagConstraints = new java.awt.GridBagConstraints();
 gridBagConstraints.gridx = 0;
 gridBagConstraints.gridy = 2;
 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
 gridBagConstraints.weightx = 1.0;
 gridBagConstraints.weighty = 1.0;
 add(scrollPane, gridBagConstraints); 

 ftpSelFilePathLabel.setBorder(javax.swing.BorderFactory
  .createEtchedBorder());
 gridBagConstraints = new java.awt.GridBagConstraints();
 gridBagConstraints.gridx = 0;
 gridBagConstraints.gridy = 3;
 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
 add(ftpSelFilePathLabel, gridBagConstraints);
 } 

 /**
 * 表格单击或双击事件的处理方法。
 */
 private void ftpDiskTableMouseClicked(java.awt.event.MouseEvent evt) {
 int selectedRow = ftpDiskTable.getSelectedRow();
 Object value = ftpDiskTable.getValueAt(selectedRow, 0);
 if (value instanceof FtpFile) {
  FtpFile selFile = (FtpFile) value;
  ftpSelFilePathLabel.setText(selFile.getAbsolutePath());
  if (evt.getClickCount() >= 2) { //双击鼠标
  if (selFile.isDirectory()) {
   try {
   ftpClient.cd(selFile.getAbsolutePath());
   listFtpFiles(ftpClient.list());
   } catch (IOException ex) {
   ex.printStackTrace();
   }
  }
  }
 }
 } 

 /**
 * 读取FTP文件到表格的方法
 * @param list
 *  读取FTP服务器资源列表的输入流
 */
 public synchronized void listFtpFiles(final TelnetInputStream list) {
 // 获取表格的数据模型
 final DefaultTableModel model = (DefaultTableModel) ftpDiskTable
  .getModel();
 model.setRowCount(0);
 // 创建一个线程类
 Runnable runnable = new Runnable() {
  public synchronized void run() {
  ftpDiskTable.clearSelection();
  try {
   String pwd = getPwd(); // 获取FTP服务器的当前文件夹
   model.addRow(new Object[] { new FtpFile(".", pwd, true),
    "", "" }); // 添加“.”符号
   model.addRow(new Object[] { new FtpFile("..", pwd, true),
    "", "" }); // 添加“..”符号
   /*
   byte[]names=new byte[2048];
   int bufsize=0;
   bufsize=list.read(names, 0, names.length);
//   list.close();
   int i=0,j=0;
   while(i<bufsize){
   char bc=(char)names[i];
   System.out.print(i+" "+bc+" ");
   //文件名在数据中开始做坐标为j,i-j为文件名的长度,文件名在数据中的结束下标为i-1
   if (names[i]==13) {
//    System.out.println("j:"+j+" i:"+i+ " i-j:"+(i-j));
    String temName=new String(names,j,i-j);
    System.out.println("temName="+temName);
    j=i+2;
   }
   i=i+1;
   }
   */
   /* 其中格式应满足如下格式的字符串 结果为:
   0 -: 1 r: 2 w: 3 x: 4 -: 5 -: 6 -: 7 -: 8 -: 9 -: 10 : 11 1: 12 : 13 u: 14 s: 15 e: 16 r: 17 : 18 g: 19 r: 20 o: 21 u: 22 p: 23 : 24 : 25 : 26 : 27 : 28 : 29 : 30 : 31 : 32 6: 33 7: 34 8: 35 4: 36 3: 37 0: 38 : 39 A: 40 p: 41 r: 42 : 43 1: 44 6: 45 : 46 2: 47 1: 48 :: 49 4: 50 6: 51 : 52 F: 53 T: 54 P: 55 ?: 56 ?: 57 ?: 58 ?: 59 ?: 60 ?: 61 ?: 62 ?: 63 ?: 64 ?: 65 ?: 66 ?: 67 ?: 68 ?: 69 ?: 70 ?: 71 ?: 72 ?: 73 .: 74 p: 75 d: 76 f: 77 

    -rwx------ 1 user group  678430 Apr 16 21:46 FTP客户端的设计与实现.pdf
    -rwx------ 1 user group 87504927 Apr 18 22:50 VC.深入详解(孙鑫)[www.xuexi111.com].pdf
    -rwx------ 1 user group  57344 Apr 18 05:32 腾讯电商2013实习生招聘TST推荐模板.xls 

    *<br>d  表示目录
    * <br>-  表示文件
    * <br>rw-rw-rw- 表示权限设置 

   dateStr:39-51
   sizeOrDir:23-38
   fileName:52-^
   */ 

   /*********************************************************/
   byte[]names=new byte[2048];
   int bufsize=0;
   bufsize=list.read(names, 0, names.length);
   int i=0,j=0;
   while(i<bufsize){
   //字符模式为10,二进制模式为13
//   if (names[i]==10) {
   if (names[i]==13) {
    //获取字符串 -rwx------ 1 user group  57344 Apr 18 05:32 腾讯电商2013实习生招聘TST推荐模板.xls
    //文件名在数据中开始做坐标为j,i-j为文件名的长度,文件名在数据中的结束下标为i-1
    String fileMessage = new String(names,j,i-j);
    if(fileMessage.length() == 0){
    System.out.println("fileMessage.length() == 0");
    break;
    }
    //按照空格将fileMessage截为数组后获取相关信息
    // 正则表达式 \s表示空格,{1,}表示1一个以上
    if(!fileMessage.split("\\s+")[8].equals(".") && !fileMessage.split("\\s+")[8].equals("..")){
    /**文件大小*/
    String sizeOrDir="";
    if (fileMessage.startsWith("d")) {//如果是目录
     sizeOrDir="<DIR>";
    }else if (fileMessage.startsWith("-")) {//如果是文件
     sizeOrDir=fileMessage.split("\\s+")[4];
    }
    /**文件名*/
    String fileName=fileMessage.split("\\s+")[8];
    /**文件日期*/
    String dateStr =fileMessage.split("\\s+")[5] +" "+fileMessage.split("\\s+")[6]+" " +fileMessage.split("\\s+")[7];
//    System.out.println("sizeOrDir="+sizeOrDir);
//    System.out.println("fileName="+fileName);
//    System.out.println("dateStr="+dateStr); 

    FtpFile ftpFile = new FtpFile();
    // 将FTP目录信息初始化到FTP文件对象中
    ftpFile.setLastDate(dateStr);
    ftpFile.setSize(sizeOrDir);
    ftpFile.setName(fileName);
    ftpFile.setPath(pwd);
    // 将文件信息添加到表格中
    model.addRow(new Object[] { ftpFile, ftpFile.getSize(),
     dateStr });
    } 

//    j=i+1;//上一次位置为字符模式
    j=i+2;//上一次位置为二进制模式
   }
   i=i+1;
   }
   list.close(); 

   /**********************************************************************
   //下面的方法太死了,不够灵活
   BufferedReader br = new BufferedReader(
    new InputStreamReader(list)); // 创建字符输入流
   String data = null;
   // 读取输入流中的文件目录
   while ((data = br.readLine()) != null) {
   // 创建FTP文件对象
   FtpFile ftpFile = new FtpFile();
   // 获取FTP服务器目录信息
    String dateStr = data.substring(39, 51).trim();
    String sizeOrDir = data.substring(23, 38).trim();
    String fileName = data.substring(52, data.length())
     .trim();
    // 将FTP目录信息初始化到FTP文件对象中
    ftpFile.setLastDate(dateStr);
    ftpFile.setSize(sizeOrDir);
    ftpFile.setName(fileName);
    ftpFile.setPath(pwd);
    // 将文件信息添加到表格中
    model.addRow(new Object[] { ftpFile, ftpFile.getSize(),
     dateStr });
   }
   br.close(); // 关闭输入流
   **********************************************************************/ 

  } catch (IOException ex) {
   Logger.getLogger(FTPClientFrame.class.getName()).log(
    Level.SEVERE, null, ex);
  }
  }
 };
 if (SwingUtilities.isEventDispatchThread()) // 启动线程对象
  runnable.run();
 else
  SwingUtilities.invokeLater(runnable);
 } 

 /**
 * 设置FTP连接,并启动下载队列线程的方法
 */
 public void setFtpClient(FtpClient ftpClient) {
 this.ftpClient = ftpClient;
 // 以30秒为间隔与服务器保持通讯
 final Timer timer = new Timer(3000, new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent e) {
  try {
   final FtpClient ftpClient = FtpPanel.this.ftpClient;
   if (ftpClient != null && ftpClient.serverIsOpen()) {
   ftpClient.noop();
   }
  } catch (IOException e1) {
   e1.printStackTrace();
  }
  }
 });
 timer.start();
 startDownThread();
 } 

 /**
 * 刷新FTP资源管理面板的当前文件夹
 */
 public void refreshCurrentFolder() {
 try {
  // 获取服务器文件列表
  TelnetInputStream list = ftpClient.list();
  listFtpFiles(list); // 调用解析方法
 } catch (IOException e) {
  e.printStackTrace();
 }
 } 

 /**
 * 开始下载队列线程
 */
 private void startDownThread() {
 if (thread != null)
  thread.stopThread();
 thread = new DownThread(this);
 thread.start();
 } 

 /**
 * 停止下载队列线程
 */
 public void stopDownThread() {
 if (thread != null) {
  thread.stopThread();
  ftpClient = null;
 }
 } 

 public String getPwd() {
 String pwd = null;
 try {
  pwd = ftpClient.pwd();
 } catch (IOException e) {
  e.printStackTrace();
 }
 return pwd;
 } 

 public Queue<Object[]> getQueue() {
 return queue;
 } 

 /**
 * 清除FTP资源表格内容的方法
 */
 public void clearTable() {
 FtpTableModel model = (FtpTableModel) ftpDiskTable.getModel();
 model.setRowCount(0);
 }
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java语言实现简单FTP软件 FTP远程文件管理模块实现(10)

    本文为大家分享了FTP远程文件管理模块的实现方法,供大家参考,具体内容如下 首先看一下界面: 1.远程FTP服务器端的文件列表的显示 将远程的当前目录下所有文件显示出来,并显示文件的属性包括文件名.大小.日期.通过javax.swing.JTable()来显示具体的数据.更改当前文件目录会调用com.oyp.ftp.panel.ftp.FtpPanel类的listFtpFiles(final TelnetInputStream list)方法,其主要代码如下 /** * 读取FTP文件到表格的方

  • iis创建用户隔离模式FTP站点的方法

    为了方便大家使用,所建立的FTP站点不仅允许匿名用户访问,而且对主目录启用了"读取"和"写入"的权限.这样一来任何人都可以没有约束地任意读写,难免出现一团糟的情况.如果您使用IIS 6.0,只需创建一个'用户隔离'的FTP站点就可以有效解决此问题. "隔离用户"是IIS 6.0中包含的FTP组件的一项新增功能.配置成"用户隔离"模式的FTP站点可以使用户登录后直接进入属于该用户的目录中,且该用户不能查看或修改其他用户的目录.

  • Java语言实现简单FTP软件 FTP协议分析(1)

    FTP(File Transfer Protocol)就是文件传输协议.通过FTP客户端从远程FTP服务器上拷贝文件到本地计算机称为下载,将本地计算机上的文件复制到远程FTP服务器上称为上传,上传和下载是FTP最常用的两个功能.FTP使用传输层的TCP协议进行传输,因此客户端与服务器之间的连接是可靠的,而且是面向连接,为数据的传输提供了可靠的保证.FTP的目标有以下目标: 提高文件的共享性 提供非直接地远程操纵计算机 避免用户因主机之间的文件存储系统的差异而导致的变化 为数据的传送提供可靠性和高

  • Java语言实现简单FTP软件 FTP软件主界面(4)

    首先看一下FTP软件的整体代码框架,具体内容如下 1.首先介绍程序的主入口FTPMain.java,采用了一个漂亮的外观风格 package com.oyp.ftp; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.UIManager; import com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel; public class F

  • Java语言实现简单FTP软件 FTP软件效果图预览之下载功能(2)

    介绍完FTP协议后,来看看该软件完成后的效果图 客户端的主界面如上图所示,主要是分为以下几个界面: 数据输入界面:用来让用户输入服务器的地址,用户名,密码,端口号等. 站点菜单.本地菜单.远程菜单以及帮助菜单. 本地文件信息显示界面:主要是用来显示本地文件列表以及文件详情,以及对文件进行相关操作. 远程文件信息显示界面:主要是用来显示远程FTP服务器端文件列表以及文件详情,以及对文件进行相关操作. 上传下载队列显示界面:显示正在下载或者上传的文件线程的进度. 下载测试 1.下载前选好要下载到的目

  • Java语言实现简单FTP软件 FTP连接管理模块实现(8)

    本文为大家介绍了FTP连接管理模块的实现方法,供大家参考,具体内容如下 (1)FTP连接 运行FTP客户端后,首先是连接FTP服务器,需要输入FTP服务器的IP地址及用户名.密码以及端口号后点击连接按钮开始连接FTP服务器,连接流程图如下图所示. 点击"连接"按钮后,会调用com.oyp.ftp.FTPClientFrame类的linkButtonActionPerformed(ActionEvent evt)方法,其主要代码程序如下 /** * 连接按钮的事件处理方法 */ riva

  • 如何编写一个创建FTP站点的函数?

    如何编写一个创建FTP站点的函数?Function ASTCreateFtpSite(IPAddress, RootDirectory, ServerComment, HostName, PortNum, Computer, Start,LogFileDirectory)    Dim MSFTPSVC, FtpServer, NewFtpServer, NewDir    Dim Bindings, BindingString, NewBindings, Index, SiteObj, bDo

  • Java语言实现简单FTP软件 FTP本地文件管理模块实现(9)

    本文为大家分享了FTP本地文件管理模块的实现方法,供大家参考,具体内容如下 首先看一下界面: 1.本地文件列表的显示功能 将本地的当前目录下所有文件显示出来,并显示文件的属性包括文件名.大小.日期.通过javax.swing.JTable()来显示具体的数据.更改当前文件目录会调用com.oyp.ftp.panel.local.LocalPanel类的listLocalFiles()方法,其主要代码如下 /** * 读取本地文件到表格的方法 */ private void listLocalFi

  • Java语言实现简单FTP软件 FTP上传下载管理模块实现(11)

    本文为大家分享了FTP上传下载管理模块的实现方法,供大家参考,具体内容如下 1.上传本地文件或文件夹到远程FTP服务器端的功能. 当用户在本地文件列表中选择想要上传的文件后,点击上传按钮,将本机上指定的文件上传到FTP服务器当前展现的目录,下图为上传子模块流程图 选择好要上传的文件或文件夹,点击"上传"按钮,会触发com.oyp.ftp.panel.local.UploadAction类的actionPerformed(ActionEvent e)方法,其主要代码如下 /** * 上传

  • Java语言实现简单FTP软件 辅助功能模块FTP站点管理实现(12)

    本文为大家分享了辅助功能模块FTP站点管理的实现方法,供大家参考,具体内容如下 1.FTP站点管理 点击"FTP站点管理"按钮,弹出对话框"FTP站点管理",如下图 1) 连接站点 在FTP站点管理面板上选好要连接的站点,点击"连接"按钮,则会将主机地址.端口号.用户名好,并将密码清空,如下图 到其主要代码如下 if (command.equals("link")) { // 如果单击的是连接按钮 frame.setLinkI

随机推荐