通过FTP传递文件

polly222 贡献于2012-07-06

作者 chengang  创建于2007-03-14 01:29:00   修改者Windows 用户  修改于2012-07-03 07:04:00字数10724

文档摘要:本实例是一个使用Java实现FTP命令的程序,可从远程FTP服务器下载文件。程序中用到了Apache的Commons Net技术。它是一个用于操作Internet基础协议(Finger,Whois,TFTP,Telnet,POP3,FTP,NNTP以及SMTP)的底层API。Commons Net包不仅支持对各种低层次协议的访问,而且还提供了一个高层的抽象,使得开发者不再需要直接面对各种协议的Socket级的低层命令。本例只使用其FTP协议。
关键词:

·· 第1章 Eclipse基础应用实例 1.4.3 通过FTP传递文件 本实例是一个使用Java实现FTP命令的程序,可从远程FTP服务器下载文件。程序中用到了Apache的Commons Net技术。它是一个用于操作Internet基础协议(Finger,Whois,TFTP,Telnet,POP3,FTP,NNTP以及SMTP)的底层API。Commons Net包不仅支持对各种低层次协议的访问,而且还提供了一个高层的抽象,使得开发者不再需要直接面对各种协议的Socket级的低层命令。本例只使用其FTP协议。 跟我做 (1)下载Commons Net包。可到Apache网站下载最新的commons-net-1.4.1.jar,网址为http://jakarta.apache.org/site/downloads/downloads_commons-net.cgi。 (2)右击“JavaApplication”项目,依次选择【新建】|【文件夹】命令,弹出【新建文件夹】对话框。在【文件夹名称】文本框中输入“lib”,单击【完成】按钮。将commons-net-1.4.1.jar复制到lib文件夹中。 (3)右击“JavaApplication”项目,选择【属性】命令,弹出【JavaApplication的属性】对话框。选择【库】选项卡,单击【添加Jar】按钮,弹出【选择JAR】对话框,如图1-8所示。选中“commons-net-1.4.1.jar”,单击【确定】按钮。返回【JavaApplication的属性】对话框,单击【确定】按钮。 图1-8 【选择JAR】对话框 (4)右击“net.chapter1”包,依次选择【新建】|【类】命令,弹出【新建Java类】对话框。在【名称】文本框中输入“FTPUtil”,单击【完成】按钮。 (5)编写程序代码。如下: public class FTPUtil { public static void main(String[] args) { //通过FTPClient的对象模拟用户访问FTP服务器 FTPClient ftpClient = new FTPClient(); String ftpServer = "101.10.10.24"; //FTP服务器 String remoteFile = "/opt/user/readme.txt"; //远程文件,复制的目标 String localFile = "E:\\temp\\readme.txt"; //本地文件,复制的目的文件 String user = "abc"; //用户名 String password = "edf"; //密码 ·· 第1章 Eclipse基础应用实例 try { ftpClient.connect(ftpServer); //连接FTP服务器 System.out.println("Connected to " + ftpServer + "."); int reply = ftpClient.getReplyCode(); //得到回复码 //如果未能正常连接,退出程序 if (!FTPReply.isPositiveCompletion(reply)) { System.out.println("FTP server refused connection!!"); System.exit(1); } //通过用户名和密码登录FTP服务器,如果登录不成功,退出程序 if (!ftpClient.login(user, password)) { ftpClient.logout(); System.out.println("I can't login!!"); System.exit(1); } //定义文件输出流,FTPClient将把远程文件以流的方式输出,并写到本地文件 OutputStream output = new FileOutputStream(localFile); ftpClient.retrieveFile(remoteFile, output); //如果传输成功,返回true output.close(); //关闭流 ftpClient.logout(); //推出登录 } catch (IOException e) { System.err.println(e); } finally { //断开FTP连接 if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException f) { System.err.println(e); } } } } } (6)运行程序。右击“FTPUtil.java”文件,依次选择【运行方式】|【Java应用程序】命令。如果程序运行成功,将会把FTP服务器的/opt/user/目录下的readme.txt文件复制到本地E:\temp目录下。 1.5 SWT界面开发实例 SWT(Standard Widget Toolkit,标准窗口小部件工具包)本身仅仅是Eclipse组织为了开发Eclipse IDE环境所编写的一组底层图形界面 API。或是无心插柳,或是有意为之,至今为止,SWT在性能和外观上都超越了SUN公司提供的AWT和SWING。 ·· 第1章 Eclipse基础应用实例 SWT已经十分稳定,它最大化了操作系统的图形构件API。也就是说,只要操作系统提供了相应图形的构件,SWT就可以应用JNI技术调用它们,只有那些操作系统中不提供的构件,SWT才自己去做一个模拟的实现。 1.5.1 使用Shell创建窗口 本小节将创建第一个SWT程序(注意,本章的例子主要针对Windows平台,其他操作系统大同小异)。本实例是一个简单的窗口,在窗口中间显示“你好,SWT!”字样。通过学习和运行本实例,读者将掌握配置SWT API,编写和运行SWT程序的方法。 图1-9 简单的SWT窗口 Display负责监管GUI的资源并管理和操作系统的通信,它不仅要关注窗口是如何显示、移动和重画的,还要确保诸如鼠标点击、键盘敲击等事件送达小部件并去处理它们。Display类不是可见的。 Shell类扮演着GUI主窗口的角色。一个Shell实例是一个可视化的应用,对主窗口的打开、激活、最大化、最小化和关闭保持追踪。Shell类的主函数为整合在GUI内的容器、小部件和事件提供了一个通用的接入点。从这一点讲,Shell的作用像是这些组件的父类。本例的运行效果是一个简单的SWT窗口,如图1-9所示。 跟我做 本实例主要包括3部分,下面依次进行讲解。 1.新建SWT项目 (1)单击【文件】菜单,依次选择【新建】|【项目】命令,弹出【新建项目】对话框。 (2)选择【Java项目】,单击【下一步】按钮。 (3)在【项目名】文本框中输入“SWT”,其他选项保持默认值,单击【完成】按钮。 2.引入SWT包 要编写SWT程序,需要引入SWT的jar包。Eclipse组织并不提供单独的SWT包下载。必须下载完整的Eclipse开发环境才能得到SWT包。SWT是作为Eclipse开发环境的一个插件形式存在。此插件名为$ECLIPSE\pluginsorg.eclipse.swt.win32.win32.x86_3.1.1.jar。 (1)右击“SWT”项目,选择【属性】命令,弹出【SWT的属性】对话框。 (2)在左侧列表中选择【Java构建路径】选项,在右侧单击【添加变量】按钮,弹出【新建变量路径条目】对话框。 (3)单击【配置变量】按钮,弹出【首选项】对话框。 (4)单击【新建】按钮,弹出【新建变量条目】对话框。 (5)在【名称】文本框中输入“SWT_LIB”,单击【文件】按钮,弹出【选择Jar】对话框,选择$ECLIPSE\pluginsorg.eclipse.swt.win32.win32.x86_3.1.1.jar。单击【打开】按钮,返回【新建变量条目】对话框,依次单击【确定】按钮。 ·· 第1章 Eclipse基础应用实例 此时,SWT_LIB变量已放入【构建路径上的JAR和类文件夹】列表框中,如图1-10所示。 图1-10 SWT_LIB的属性配置 3.编写程序 (1)右击“src”文件夹,依次选择【新建】|【包】命令,弹出【新建Java包】对话框。在【名称】文本框中输入“net.chapter4”,单击【完成】按钮。 (2)右击“net.chapter4”包,依次选择【新建】|【类】命令,弹出【新建Java类】对话框。在【名称】文本框中输入“SimpleForm”,单击【完成】按钮。 (3)编写程序代码。代码如下: public class SimpleForm { public static void main(String[] args) { Display display = new Display(); //创建Display实例 Shell shell = new Shell(display); //创建Shell实例 shell.setText("窗口"); //设置窗口的显示标签 shell.setBounds(200,200,500,350); //设置shell的显示范围 //设置窗口布局 FormLayout layout = new FormLayout(); layout.marginHeight = 50; layout.marginWidth = 50; shell.setLayout(layout); //创建标签,用于显示"你好,SWT!"字样 Label helloLabel=new Label(shell,SWT.CENTER); //采用SWT.CENTER样式,即居中 显示 helloLabel.setText("你好,SWT!"); shell.pack(); //以紧凑方式显示窗口并自动调节大小 shell.open(); //打开shell,类似于打开窗口 //开始事件处理循环,直到用户关闭窗口 while (!shell.isDisposed()) { if (!display.readAndDispatch()) ·· 第1章 Eclipse基础应用实例 display.sleep(); } display.dispose(); } } 4.配置本机图形库并运行程序 用SWT编写的GUI与其所运行的平台的外观一致,速度也与本机程序相仿。这是因为SWT调用了操作系统自带的图形库,因此在运行程序时需指出本机图形库的位置。SWT本机图形文件名一般为swt-win32-nnnn.dll,这里的nnnn代表4位整数,它们位于$ECLIPSE\plugins\org.eclipse.swt.win32. win32.x86_3.1.1.jar包中。为了确保这些库文件能被程序所用,可将本机图形库放进java.library.path变量所包含的任何目录中。 (1)解压org.eclipse.swt.win32.win32.x86_3.1.1.jar至任意目录,如E:\swt目录。 (2)右击“SimpleForm.java”文件,依次选择【运行方式】|【运行】命令,弹出【运行】对话框。选择左侧的SWT应用程序,单击【新建】按钮,自动新建SimpleForm项。在右侧选择【自变量】选项卡,在【VM自变量】文本框中输入“-Djava.library.path=E:\swt”,如图1-11所示。 图1-11 java.library.path参数配置 (3)单击【运行】按钮,运行SimpleForm程序。 1.5.2 简单的用户密码验证器 本小节实例将实现一个简单的用户密码验证器,如果输入用户名“abc”、密码“abc”,窗口将显示“通过”字样,否则显示“不通过”。 SWT 2.0提供了一种新的标准布局:FormLayout。FormLayout通过定义组件4个边的“粘贴 ·· 第1章 Eclipse基础应用实例 ”位置来排列组件,被引用的相对的组件可以是父组件,也可以是同一容器中的其他组件。 SWT的事件处理模型和AWT类似,事件的处理委托给外部实体进行,实现了将事件源和监听器分开,通过addXXXXListener方法向组件注册监听器。本例将使用SelectionAdapter处理按钮单击事件。程序的运行效果分别如下。 (1)用户密码验证初始窗口如图1-12所示。 (2)当输入用户名“abc”、密码“abc”时,窗口显示“通过”字样,如图1-13所示。 (3)当输入其他的用户名和密码时,窗口显示“不通过”字样,如图1-14所示。 图1-12 用户密码验证初始窗口 图1-13 用户名密码通过验证 图1-14 用户名密码未能通过验证 跟我做 1.新建Java文件UserPassword.java 右击包名“net.chapter5”,依次选择【新建】|【类】命令,在弹出的新类对话框中输入类名UserPassword,单击【完成】按钮。 2.编写代码 首先创建用于界面显示的控件,并设置FormLayout布局。代码如下: public class UserPassword { Display display = new Display(); //创建Display实例 Shell shell = new Shell(display); //创建Shell实例 Text nameText; //“用户名”文本框 Text passText; //“密码”文本框 Button submit; //“确定”按钮 Button cancel; //“取消”按钮 Label resultLabel; //显示验证结果标签 //用户密码验证方法的实现 public UserPassword() { //设置FormLayout布局,定义空白边 FormLayout layout = new FormLayout(); FormData data = new FormData(); //定义具体的布局数据 layout.marginHeight = 20; //设置空白边高度 layout.marginWidth = 30; //设置空白边宽度 shell.setLayout(layout); shell.setText("用户密码验证"); Label nameLabel = new Label(shell, SWT.NONE); //“用户名”标签 ·· 第1章 Eclipse基础应用实例 nameLabel.setText("用户名"); //设置标签内容 //定义name标签的位置。它的顶边离父组件(窗口shell)的空白边距离是父组件clientAr(除空白边以外的空间)高度的15%,偏移的点数为0 data.top = new FormAttachment(15, 0); nameLabel.setLayoutData(data); 定义name文本框的位置。它的顶边在nameLabel标签的中心位置,左边距nameLabel标签的右边有10个点。代码如下: nameText = new Text(shell, SWT.SINGLE | SWT.BORDER); data = new FormData(); data.top = new FormAttachment(nameLabel, 0, SWT.CENTER); data.left = new FormAttachment(nameLabel, 10, SWT.RIGHT); nameText.setLayoutData(data); 定义passLabel标签的位置。它的顶边距nameLabel标签的底边有10个点数的偏移。代码如下: Label passLabel = new Label(shell, SWT.NONE); passLabel.setText("密码"); data = new FormData(); data.top = new FormAttachment(nameLabel, 10, SWT.BOTTOM); passLabel.setLayoutData(data); 定义pass文本输入的位置。它的顶边在passLabel标签的中心位置,左边与nameText文本框的左边对齐。代码如下: passText = new Text(shell, SWT.SINGLE | SWT.BORDER); passText.setEchoChar('*');//输入字符显示为"*" passText.setTabs(2); data = new FormData(); data.top = new FormAttachment(passLabel, 0, SWT.CENTER); data.left = new FormAttachment(nameText, 0, SWT.LEFT); passText.setLayoutData(data); //两个button由一个使用RowLayout的组件来设置 Composite towButton = new Composite(shell, SWT.NONE); RowLayout rowLayout = new RowLayout(); rowLayout.justify = true; towButton.setLayout(rowLayout); 定义button组件的位置。它的顶边距passLabel标签的底边有15个点数,左边与passLabel标签的左边对齐,右边与passText文本输入的右边对齐。代码如下: data = new FormData(); data.top = new FormAttachment(passLabel, 15, SWT.BOTTOM); data.left = new FormAttachment(passLabel, 0, SWT.LEFT); ·· 第1章 Eclipse基础应用实例 data.right = new FormAttachment(passText, 0, SWT.RIGHT); towButton.setLayoutData(data); 定义显示结果的resultLabel标签。它的顶边距towButton的底边有15个点数,左边与towButton标签的左边对齐,右边与towButton文本输入的右边对齐。代码如下: Composite resultComp = new Composite(shell, SWT.NONE); resultComp.setLayout(rowLayout); resultLabel = new Label(resultComp, SWT.CENTER); resultLabel.setText("是否通过验证?"); data = new FormData(); data.top = new FormAttachment(towButton, 15, SWT.BOTTOM); data.left = new FormAttachment(towButton, 0, SWT.LEFT); data.right = new FormAttachment(towButton, 0, SWT.RIGHT); resultComp.setLayoutData(data); 为submit按钮添加事件监听器,如果用户名和密码均为“abc”,则通过验证,否则不通过。代码如下: submit = new Button(towButton, SWT.PUSH); submit.setText("确定"); submit.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { if (nameText.getText().equals("abc")//判断用户名是否为“abc” && passText.getText().equals("abc")) {//判断密码是否为“abc” resultLabel.setText("通过"); } else { resultLabel.setText("不通过"); } } }); 为cancel按钮添加事件监听器,将nameText文本框和passText文本框清空。代码如下: cancel = new Button(towButton, SWT.PUSH); cancel.setText("取消"); cancel.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { nameText.setText(""); passText.setText(""); } }); shell.pack(); shell.open(); //开始事件处理循环,直到用户关闭窗口 while (!shell.isDisposed()) { if (!display.readAndDispatch()) { ·· 第1章 Eclipse基础应用实例 // If no more entries in event queue display.sleep(); } } display.dispose(); } //主函数 public static void main(String[] args) { new UserPassword(); } } 3.设置java.library.path参数并运行程序 (1)右击“UserPassword.java”文件,依次选择【运行方式】|【运行】命令,弹出【运行】对话框。选择左侧的SWT应用程序,单击【新建】按钮,自动新建UserPassword项。在右侧选择【自变量】选项卡,在【VM自变量】文本框中输入“-Djava.library.path=E:\swt”。 (2)单击【运行】按钮,运行UserPassword程序。 1.5.3 文件选择器 本小节实例将实现一个文件选择器。从文件选择器中可选择一个或多个文件,选择完成后,可在窗口中显示所选文件的路径和名称。FileDialog类实现了用户对文件的操作,它可让用户浏览文件,选择一个或多个文件。用户可设置默认的文件浏览路径,可设置默认的文件类型。程序的运行效果分别如下。 (1)文件选择器运行初始窗口如图1-15所示。 (2)单击【请选择文件】按钮,弹出【打开】对话框,如图1-16所示。 图1-15 文件选择器运行初始窗口 图1-16 【打开】对话框 (3)选择多个文件后,将在【文件选择器】窗口显示所选文件的路径和名称,如图1-17所示。 ·· 第1章 Eclipse基础应用实例 图1-17 选择文件后的窗口 跟我做 1.新建Java文件FileSelection.java 右击包名“net.chapter5”,依次选择【新建】|【类】命令,在弹出的新建类对话框中输入类名FileSelection,单击【完成】按钮。 2.编写代码 public class FileSelection { Display display = new Display(); //创建Display实例 Shell shell = new Shell(display); //创建Shell实例 Label fileLabel; //用于显示文件的标签 Button selectFileButton; //文件选择按钮 String filePath = "c:\\"; //“打开”文件对话框默认路径 //文件选择器的实现 public FileSelection() { //设置标签的样式、背景和文字 fileLabel = new Label(shell, SWT.BORDER | SWT.WRAP); fileLabel.setBackground(display.getSystemColor(SWT.COLOR_WHITE)); fileLabel.setText("单击按钮,选择文件。"); //实例化按钮并设置显示文字 selectFileButton = new Button(shell, SWT.PUSH); selectFileButton.setText("请选择文件:"); 以下为程序的关键部分:为按钮添加事件监听器,限定默认文件的类型为文本文件和HTML文件。用户选择多个文件后,将文件名放入一个String类型的数组中。代码如下: selectFileButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { //设置弹出的文件选择对话框 FileDialog fileDialog = new FileDialog(shell, SWT.MULTI); fileDialog.setFilterPath(filePath); //限定文件的类型 fileDialog.setFilterExtensions(new String[] { "*.txt","*.html", "*.*" }); fileDialog.setFilterNames(new String[] { "文本文件", "HTML文件", "任何" }); String firstFile = fileDialog.open(); //当选择了一或多个文件 if (firstFile != null) { filePath = fileDialog.getFilterPath(); //取得文件名并在标签中显示 String[] selectedFiles = fileDialog.getFileNames(); StringBuffer sb = new StringBuffer("您选择了如下的文件 " ·· 第1章 Eclipse基础应用实例 + fileDialog.getFilterPath() + "\\ \n"); for (int i = 0; i < selectedFiles.length; i++) { sb.append(selectedFiles[i] + "\n"); } fileLabel.setText(sb.toString()); } } }); fileLabel.setBounds(0, 0, 400, 100); selectFileButton.setBounds(100, 110, 200, 25); shell.setText("文件选择器"); shell.pack(); shell.open(); //开始事件处理循环,直到用户关闭窗口 while (!shell.isDisposed()) { if (!display.readAndDispatch()) { // If no more entries in event queue display.sleep(); } } display.dispose(); } //主函数 public static void main(String[] args) { new FileSelection(); } } 3.设置java.library.path参数并运行程序 (1)右击“FileSelection.java”文件,依次选择【运行方式】|【运行】命令,弹出【运行】对话框。选择左侧的SWT应用程序,单击【新建】按钮,自动新建FileSelection项。在右侧选择【自变量】选项卡,在【VM自变量】文本框中输入“-Djava.library.path=E:\swt”。 (2)单击【运行】按钮,运行FileSelection程序。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档