如何进行ftp客户端程序设计(FTP客户端程序设计)

      最后更新:2023-05-25 16:58

      ftp的客户端的编写

      利用org.apache.commons.net.ftp包实现一个简单的ftp客户端实用类。主要实现一下功能 1.支持上传下载。支持断点续传2.支持进度汇报3.支持对于中文目录及中文文件创建的支持。package apache.net.test;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.PrintWriter;import org.apache.commons.net.PrintCommandListener;import org.apache.commons.net.ftp.FTP;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftp.FTPFile;import org.apache.commons.net.ftp.FTPReply;public class ContinueFTP {private FTPClient ftpClient = new FTPClient();public ContinueFTP(){//设置将过程中使用到的命令输出到控制台this.ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));}/*** 连接到FTP服务器* @param hostname 主机名* @param port 端口* @param username 用户名* @param password 密码* @return 是否连接成功* @throws IOException*/public boolean connect(String hostname,int port,String username,String password) throws IOException{ftpClient.connect(hostname, port);if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){if(ftpClient.login(username, password)){return true;}}disconnect();return false;}/*** 从FTP服务器上下载文件* @param remote 远程文件路径* @param local 本地文件路径* @return 是否成功* @throws IOException*/public boolean download(String remote,String local) throws IOException{ftpClient.enterLocalPassiveMode();ftpClient.setFileType(FTP.BINARY_FILE_TYPE);boolean result;File f = new File(local);FTPFile[] files = ftpClient.listFiles(remote);if(files.length != 1){System.out.println("远程文件不唯一");return false;}long lRemoteSize = files[0].getSize();if(f.exists()){OutputStream out = new FileOutputStream(f,true);System.out.println("本地文件大小为:"+f.length());if(f.length() >= lRemoteSize){System.out.println("本地文件大小大于远程文件大小,下载中止");return false;}ftpClient.setRestartOffset(f.length());result = ftpClient.retrieveFile(remote, out);out.close();}else {OutputStream out = new FileOutputStream(f);result = ftpClient.retrieveFile(remote, out);out.close();}return result;}/*** 上传文件到FTP服务器,支持断点续传* @param local 本地文件名称,绝对路径* @param remote 远程文件路径,使用/home/directory1/subdirectory/file.ext 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构* @return 上传结果* @throws IOException*/public UploadStatus upload(String local,String remote) throws IOException{//设置PassiveMode传输ftpClient.enterLocalPassiveMode();//设置以二进制流的方式传输ftpClient.setFileType(FTP.BINARY_FILE_TYPE);UploadStatus result;//对远程目录的处理String remoteFileName = remote;if(remote.contains("/")){remoteFileName = remote.substring(remote.lastIndexOf("/")+1);String directory = remote.substring(0,remote.lastIndexOf("/")+1);if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(directory)){//如果远程目录不存在,则递归创建远程服务器目录int start=0;int end = 0;if(directory.startsWith("/")){start = 1;}else{start = 0;}end = directory.indexOf("/",start);while(true){String subDirectory = remote.substring(start,end);if(!ftpClient.changeWorkingDirectory(subDirectory)){if(ftpClient.makeDirectory(subDirectory)){ftpClient.changeWorkingDirectory(subDirectory);}else {System.out.println("创建目录失败");return UploadStatus.Create_Directory_Fail;}}start = end + 1;end = directory.indexOf("/",start);//检查所有目录是否创建完毕if(end <= start){break;}}}}//检查远程是否存在文件FTPFile[] files = ftpClient.listFiles(remoteFileName);if(files.length == 1){long remoteSize = files[0].getSize();File f = new File(local);long localSize = f.length();if(remoteSize==localSize){return UploadStatus.File_Exits;}else if(remoteSize > localSize){return UploadStatus.Remote_Bigger_Local;}//尝试移动文件内读取指针,实现断点续传InputStream is = new FileInputStream(f);if(is.skip(remoteSize)==remoteSize){ftpClient.setRestartOffset(remoteSize);if(ftpClient.storeFile(remote, is)){return UploadStatus.Upload_From_Break_Success;}}//如果断点续传没有成功,则删除服务器上文件,重新上传if(!ftpClient.deleteFile(remoteFileName)){return UploadStatus.Delete_Remote_Faild;}is = new FileInputStream(f);if(ftpClient.storeFile(remote, is)){result = UploadStatus.Upload_New_File_Success;}else{result = UploadStatus.Upload_New_File_Failed;}is.close();}else {InputStream is = new FileInputStream(local);if(ftpClient.storeFile(remoteFileName, is)){result = UploadStatus.Upload_New_File_Success;}else{result = UploadStatus.Upload_New_File_Failed;}is.close();}return result;}/*** 断开与远程服务器的连接* @throws IOException*/public void disconnect() throws IOException{if(ftpClient.isConnected()){ftpClient.disconnect();}}public static void main(String[] args) {ContinueFTP myFtp = new ContinueFTP();try {myFtp.connect("192.168.21.171", 21, "test", "test");System.out.println(myFtp.upload("E:\VP6.flv", "/MIS/video/VP6.flv"));myFtp.disconnect();} catch (IOException e) {System.out.println("连接FTP出错:"+e.getMessage());}} }
      请将问题描述完全,彼得堡“拓”形象愿意为您服务!
      ftp的客户端的编写

      怎么用Java开发FTP客户端

      摘要 本文解释了如何利用库用Java语言编写FTP客户端代码。它比较了FTP库的一个完全列表,演示了每个库的优点和缺点,并且帮助决策者为他们的需要选择适当的库。另外,本文阐述了Fa?ade模式如何在取代一个库时改变管理。最后,作者Jean-Pierre Norguet讨论并解决了由于缺乏权威性的说明书引起的一些问题。让我们假设一个情景:我们要编写一个纯Java应用程序,该程序必须从运行FTP服务器的远程计算机上下载文件。我们也通过远程文件信息,像名字、日期、或者尺寸,来过滤下载。自己来写一个FTP协议处理,尽管是有可能,并且可能很有趣。但是这样做也有可能有困难、花费长时间、并且有潜在的风险。既然我们不肯花费时间、精力、或者金钱自己来写一个处理器,那我们推荐使用一个可重用的现有的软件组件。万维网上有并且大量的库可供使用。有了一个FTP客户端库,下载一个文件用Java语言编写就像下面一样简单:FTPClient ftpClient = new FTPClient();ftpClient.connect("ftp.foo.com", "user01", "pass1234");ftpClient.download("C:\Temp\", "README.txt");// Eventually other operations here ...ftpClient.disconnect();寻找一个适合我们需要的高质量的Java FTP客户端库并不像他看起来那么简单;它可能相当困难。要找到一个Java FTP客户端库需要花一些时间。接着,在我们找到所有的已存在的库之后,我们选哪个?每个库适合不同的需要。库在质量上是不等的,并且它们的设计有本质的区别。每个提供一套不同的属性和使用不同类型的行话来描述他们。因此,计算和比较FTP客户端库证明是困难而且令人迷惑的。重复使用已存在的组件是一个值得推荐的过程,但在这个例子中,启动它也是令人沮丧的。并且这有点羞愧:在选好的一个好的FTP库之后,剩下的工作就是例程了。本文旨在使选择过程简短、容易、并且有价值。我首先列出了所有的FTP客户端库。接着,我定义和描述了库应该用某种方式找到的相关标准的一个表格。最后,我列出了一个总浏览的矩阵,该矩阵给出了库间相互比较的过程的快速浏览。所有的信息提供了我们作出一个迅速、可靠、和长期的决定所需的每件事。使用JDK(Java 开发工具集)的FTP支持用于FTP的访问规范是用于注释的请求:959(RFC959)。Sun Microsystems提供了JDK的一个RFC959执行。但是它是内部的、非文档化的、并且不提供任何资源。当RFC959在尚未公开时,它实际上是执行RFC1738、URL规范的一个公共界面的后终端。如图1。图1. 使用JDK的FTP支持。RFC1738的一个执行过程在JDK中作为标准给出。它为基本的FTP传送做一个可推理的工作。它是公共的、文档化的、并且提供源代码。要使用它,我们可编写下面语句:URL url = new URL("ftp://user01:pass1234@ftp.foo.com/README.txt;type=i");URLConnection urlc = url.openConnection();InputStream is = urlc.getInputStream(); // To downloadOutputStream os = urlc.getOutputStream(); // To upload使用JDK的FTP客户端严格的遵守标准推荐,但它有以下几个说明:它从根本上区别于第三方的FTP客户端库;这些执行RFC959而不是RFC1738RFC959用大多数的桌面FTP客户端工具执行。许多Java程序员使用这些工具连接到FTP服务器上。作为一个尝试,这些工具及有可能优先于类似的RFC959库。URL 和URLConnection类只开放用于通讯的流。Sun库不为构造原始的FTP服务器响应成为像String、 File、 RemoteFile、 或者 Calendar之类的更合用的Java对象而提供直接支持。所以我们不得不编写更多的代码,只是为了把数据写入一个文件中或者开始一个目录列表。正像RFC1738的3.2部分解释的一样,"最优化",FTP URL在每个操作后要求关闭(控制)连接。这对于传送许多小文件是一种浪费、并且毫无效率。而且,作了特别限制FTP服务器可能把会这样一个通讯开销认为一个是恶毒的网络攻击或者滥用而拒绝提供进一步的服务。最后,它缺乏几个有用的属性。由于以上所有或者某种原因,可优先使用一个第三方的库。下面部分列出了可供选择的第三方的库。见:http://www.javaworld.com/javaworld/jw-04-2003/ftp/jw-0404-ftptable.html
      只能给楼主个思路了,具体实现自己研究去. 用Java的socket来做.建立主机和客户端通信. 然后用Java的IO流来对文件进行操作.
      用易语言可能好编一点,里面有FTP函数,可以直接调用。
      怎么用Java开发FTP客户端

      使用 C++语言设计一个ftp客户端软件,如何入手?

      也不一定要用VC++,C也行要使用api,这篇文章使用的mfc写的很好照着做就能做出来一个类似你要的 http://blog.163.com/huangguoqiang_123@126/blog/static/141043114201042905746/
      可以参照开放源码的项目FileZilla,应该比较符合你的要求。 http://sourceforge.net/projects/filezilla
      你会不会网编程,socket熟不熟,找个例子看一看,在看看ftp的协议,你也不用全部支持,一般的put,get命令支持一下就行,命令行也可以啊,不一定要mfc
      MFC其实是比较简单的,你做的时候可以随便画界面,然后用到什么控件,去MSDN搜索控件的成员函数,看下就会知道这个控件怎么使用。其实可以看一下《深入浅出MFC》
      使用 C++语言设计一个ftp客户端软件,如何入手?

      FTP客户端程序设计(java)

      package jing.upfile; import sun.net.ftp.*;import sun.net.*;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ByteArrayOutputStream;import java.util.ArrayList;import java.util.StringTokenizer;/**FTP远程命令列表
      USERPORTRETRALLODELESITEXMKDCDUPFEAT
      PASSPASVSTORRESTCWD STATRMD XCUPOPTS
      ACCTTYPEAPPERNFRXCWDHELPXRMDSTOUAUTH
      REINSTRUSMNTRNTOLISTNOOPPWD SIZEPBSZ
      QUITMODESYSTABORNLSTMKD XPWDMDTMPROT
      在服务器上执行命令,如果用sendServer来执行远程命令(不能执行本地FTP命令)的话,所有FTP命令都要加上rn
      ftpclient.sendServer("XMKD /test/bbrn"); //执行服务器上的FTP命令
      ftpclient.readServerResponse一定要在sendServer后调用
      nameList("/test")获取指目录下的文件列表
      XMKD建立目录,当目录存在的情况下再次创建目录时报错
      XRMD删除目录
      DELE删除文件
      *

      Title: 使用JAVA操作FTP服务器(FTP客户端)

      *

      Description: 上传文件的类型及文件大小都放到调用此类的方法中去检测,比如放到前台JAVASCRIPT中去检测等* 针对FTP中的所有调用使用到文件名的地方请使用完整的路径名(绝对路径开始)。*

      *

      Copyright: Copyright (c) 2005

      *

      Company: 静靖工作室

      * @author 欧朝敬13873195792* @version 1.0*/public class FtpUpfile {private FtpClient ftpclient;private String ipAddress;private int ipPort;private String userName;private String PassWord;/*** 构造函数* @param ip String 机器IP* @param port String 机器FTP端口号* @param username String FTP用户名* @param password String FTP密码* @throws Exception*/public FtpUpfile(String ip, int port, String username, String password) throwsException {ipAddress = new String(ip);ipPort = port;ftpclient = new FtpClient(ipAddress, ipPort);//ftpclient = new FtpClient(ipAddress);userName = new String(username);PassWord = new String(password);}/*** 构造函数* @param ip String 机器IP,默认端口为21* @param username String FTP用户名* @param password String FTP密码* @throws Exception*/public FtpUpfile(String ip, String username, String password) throwsException {ipAddress = new String(ip);ipPort = 21;ftpclient = new FtpClient(ipAddress, ipPort);//ftpclient = new FtpClient(ipAddress);userName = new String(username);PassWord = new String(password);}/*** 登录FTP服务器* @throws Exception*/public void login() throws Exception {ftpclient.login(userName, PassWord);}/*** 退出FTP服务器* @throws Exception*/public void logout() throws Exception {//用ftpclient.closeServer()断开FTP出错时用下更语句退出ftpclient.sendServer("QUITrn");int reply = ftpclient.readServerResponse(); //取得服务器的返回信息}/*** 在FTP服务器上建立指定的目录,当目录已经存在的情下不会影响目录下的文件,这样用以判断FTP* 上传文件时保证目录的存在目录格式必须以"/"根目录开头* @param pathList String* @throws Exception*/public void buildList(String pathList) throws Exception {ftpclient.ascii();StringTokenizer s = new StringTokenizer(pathList, "/"); //signint count = s.countTokens();String pathName = "";while (s.hasMoreElements()) {pathName = pathName + "/" + (String) s.nextElement();try {ftpclient.sendServer("XMKD " + pathName + "rn");} catch (Exception e) {e = null;}int reply = ftpclient.readServerResponse();}ftpclient.binary();}/*** 取得指定目录下的所有文件名,不包括目录名称* 分析nameList得到的输入流中的数,得到指定目录下的所有文件名* @param fullPath String* @return ArrayList* @throws Exception*/public ArrayList fileNames(String fullPath) throws Exception {ftpclient.ascii(); //注意,使用字符模式TelnetInputStream list = ftpclient.nameList(fullPath);byte[] names = new byte[2048];int bufsize = 0;bufsize = list.read(names, 0, names.length); //从流中读取list.close();ArrayList namesList = new ArrayList();int i = 0;int j = 0;while (i < bufsize /*names.length*/) {//char bc = (char) names;//System.out.println(i + "" + bc + " : " + (int) names);//i = i + 1;if (names == 10) { //字符模式为10,二进制模式为13//文件名在数据中开始下标为j,i-j为文件名的长度,文件名在数据中的结束下标为i-1//System.out.write(names, j, i - j);//System.out.println(j + " " + i + "" + (i - j));String tempName = new String(names, j, i - j);namesList.add(tempName);//System.out.println(temp);// 处理代码处//j = i + 2; //上一次位置二进制模式j = i + 1; //上一次位置字符模式}i = i + 1;}return namesList;}/*** 上传文件到FTP服务器,destination路径以FTP服务器的"/"开始,带文件名、* 上传文件只能使用二进制模式,当文件存在时再次上传则会覆盖* @param source String* @param destination String* @throws Exception*/public void upFile(String source, String destination) throws Exception {buildList(destination.substring(0, destination.lastIndexOf("/")));ftpclient.binary(); //此行代码必须放在buildList之后TelnetOutputStream ftpOut = ftpclient.put(destination);TelnetInputStream ftpIn = new TelnetInputStream(newFileInputStream(source), true);byte[] buf = new byte[204800];int bufsize = 0;while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {ftpOut.write(buf, 0, bufsize);}ftpIn.close();ftpOut.close();}/*** JSP中的流上传到FTP服务器,* 上传文件只能使用二进制模式,当文件存在时再次上传则会覆盖* 字节数组做为文件的输入流,此方法适用于JSP中通过* request输入流来直接上传文件在RequestUpload类中调用了此方法,* destination路径以FTP服务器的"/"开始,带文件名* @param sourceData byte[]* @param destination String* @throws Exception*/public void upFile(byte[] sourceData, String destination) throws Exception {buildList(destination.substring(0, destination.lastIndexOf("/")));ftpclient.binary(); //此行代码必须放在buildList之后TelnetOutputStream ftpOut = ftpclient.put(destination);ftpOut.write(sourceData, 0, sourceData.length);//ftpOut.flush();ftpOut.close();}/*** 从FTP文件服务器上下载文件SourceFileName,到本地destinationFileName* 所有的文件名中都要求包括完整的路径名在内* @param SourceFileName String* @param destinationFileName String* @throws Exception*/public void downFile(String SourceFileName, String destinationFileName) throwsException {ftpclient.binary(); //一定要使用二进制模式TelnetInputStream ftpIn = ftpclient.get(SourceFileName);byte[] buf = new byte[204800];int bufsize = 0;FileOutputStream ftpOut = new FileOutputStream(destinationFileName);while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {ftpOut.write(buf, 0, bufsize);}ftpOut.close();ftpIn.close();}/***从FTP文件服务器上下载文件,输出到字节数组中* @param SourceFileName String* @return byte[]* @throws Exception*/public byte[] downFile(String SourceFileName) throwsException {ftpclient.binary(); //一定要使用二进制模式TelnetInputStream ftpIn = ftpclient.get(SourceFileName);ByteArrayOutputStream byteOut = new ByteArrayOutputStream();byte[] buf = new byte[204800];int bufsize = 0;while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {byteOut.write(buf, 0, bufsize);}byte[] return_arraybyte = byteOut.toByteArray();byteOut.close();ftpIn.close();return return_arraybyte;}/**调用示例* FtpUpfile fUp = new FtpUpfile("192.168.0.1", 21, "admin", "admin");* fUp.login();* fUp.buildList("/adfadsg/sfsdfd/cc");* String destination = "/test.zip";* fUp.upFile("C:\Documents and Settings\Administrator\My Documents\sample.zip",destination);* ArrayList filename = fUp.fileNames("/");* for (int i = 0; i < filename.size(); i++) {* System.out.println(filename.get(i).toString());* }* fUp.logout();* @param args String[]* @throws Exception*/public static void main(String[] args) throws Exception {FtpUpfile fUp = new FtpUpfile("192.150.189.22", 21, "admin", "admin");fUp.login();/*fUp.buildList("/adfadsg/sfsdfd/cc");String destination = "/test/SetupDJ.rar";fUp.upFile("C:\Documents and Settings\Administrator\My Documents\SetupDJ.rar",destination);ArrayList filename = fUp.fileNames("/");for (int i = 0; i < filename.size(); i++) {System.out.println(filename.get(i).toString());}fUp.downFile("/sample.zip", "d:\sample.zip");*/FileInputStream fin = new FileInputStream("C:\AAA.TXT");byte[] data = new byte[20480];fin.read(data, 0, data.length);fUp.upFile(data, "/test/BBB.exe");fUp.logout();System.out.println("程序运行完成!");/*FTP远程命令列表USERPORTRETRALLODELESITEXMKDCDUPFEATPASSPASVSTORRESTCWD STATRMD XCUPOPTSACCTTYPEAPPERNFRXCWDHELPXRMDSTOUAUTHREINSTRUSMNTRNTOLISTNOOPPWD SIZEPBSZQUITMODESYSTABORNLSTMKD XPWDMDTMPROT*//*在服务器上执行命令,如果用sendServer来执行远程命令(不能执行本地FTP命令)的话,所有FTP命令都要加上rnftpclient.sendServer("XMKD /test/bbrn"); //执行服务器上的FTP命令ftpclient.readServerResponse一定要在sendServer后调用nameList("/test")获取指目录下的文件列表XMKD建立目录,当目录存在的情况下再次创建目录时报错XRMD删除目录DELE删除文件*/} }
      太假了,这只是我们的计算机网络的一个实验,你居然用来当课设...
      mina.apache.org 服务器端,客户端都有!开源的!
      已经发到你邮箱里了!注意接收!!
      FTP客户端程序设计(java)

      用C语言写一个FTP的客户端程序,需要了解哪些知识

      一、需要的知识点: 1、SOCKET技术,网络编程的基本功能2、FTP3、如果需要自己写,可能需要熟悉各个网络框架二、编写FTP所需要掌握的框架1、wininet 2、libcurl
      用C语言写一个FTP的客户端程序,需要了解哪些知识

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类