`
starbhhc
  • 浏览: 655572 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

FTP实现客户端与服务器文件传输(二)

    博客分类:
  • java
 
阅读更多

/*
以sun开头的class不是java里面的标准类,而是sun公司自己的的class,因此,他们位于rt.jar当中。因此,jdk源代码中没有提供源文件。但是,可以用诸如jad之类的反编译工具进行反编译。
实际上,基本原理就是利用Socket和ServerSocket来发送遵守FTP协议的消息,与FTP服务器进行交互。
主要用到这么几个类:
sun.net.ftp.FtpClient extends sun.net.TransferProtocolClient
sun.net.TransferProtocolClient extends sun.net.NetworkClient
sun.net.TelnetInputStream extends FilterInputStream
sun.net.TelnetOutputStream extends BufferedOutputStream
因为是使用被动模式,因此,客户端要去连接服务端,
在FtpClient的源代码的openDataConnection(String s)方法中有这么一句:
serversocket = new ServerSocket(0, 1);也就是客户端随便选择一个空闲端口。
也就是说,sun的FtpClient不支持主动模式。
*/

 

 

public class FtpUtils {

 

 

 /**

  * 向FTP服务器上传文件

  * 

  * @param ip

  *            FTP服务器ip e.g:192.168.8.22

  * @param port

  *            FTP服务器端口 

  * @param username

  *            FTP登录账号 

  * @param password

  *            FTP登录密码  

  * @param serverpath

  *            FTP服务器保存目录(相对路径) 默认缺省时指向主目录

  * @param file

  *            上传到FTP服务器上的文件的绝对路径 e.g: E:/log/log.txt OR E:/log/log.txt

  *            

  * @return 

  *      成功返回true,否则返回false

  */

 public boolean uploadFile(String ip, int port, String username,

   String password, String serverpath, String file) {

  // 初始表示上传失败

  boolean success = false;

  // 创建FTPClient对象

  FTPClient ftp = new FTPClient();

  ftp.setControlEncoding("UTF-8"); 

  try {

   int reply=0;

   // 连接FTP服务器

   // 如果采用默认端口,可以使用ftp.connect(ip)的方式直接连接FTP服务器

   ftp.connect(ip, port);

   // 登录ftp

   ftp.login(username, password);

   // 看返回的值是不是reply>=200&&reply<300 如果是,表示登陆成功

   reply = ftp.getReplyCode();

   // 以2开头的返回值就会为真

   if (!FTPReply.isPositiveCompletion(reply)) {

    ftp.disconnect();

    return success;

   }

   // 转到指定上传目录

   serverpath=gbkToIso8859(serverpath);

   ftp.changeWorkingDirectory(iso8859ToGbk(serverpath));

   

   checkPathExist(ftp,iso8859ToGbk(serverpath));

   

   //输入流

   InputStream input=null;

   try {

    file=gbkToIso8859(file);

    input = new FileInputStream(iso8859ToGbk(file));

   } catch (FileNotFoundException e) {

    e.printStackTrace();

   }

   // 将上传文件存储到指定目录

   file=iso8859ToGbk(file);

   flag=ftp.storeFile(iso8859ToGbk(serverpath)+"/"+iso8859ToGbk(getFilename(file)), input);

   // 关闭输入流

   input.close();

   // 退出ftp

   ftp.logout();

   } catch (IOException e) {

   e.printStackTrace();

  } finally {

   if (ftp.isConnected()) {

    try {

     ftp.disconnect();

    } catch (IOException ioe) {

    }

   }

  }

  return success;

 }

 

 /**

  * 从FTP服务器下载文件

  * 

  * @param ip

  *            FTP服务器ip e.g:192.168.8.22

  * @param port

  *            FTP服务器端口

  * @param username

  *            FTP登录账号

  * @param password

  *            FTP登录密码

  * @param serverpath

  *            FTP服务器上的相对路径 默认缺省时指向主目录

  * @param fileName

  *            要下载的文件名

  * @param localPath

  *            下载后保存到本地的路径 不含文件名

  * @return

  *      成功返回true,否则返回false

  */

 public boolean downFile(String ip, int port, String username,

   String password, String serverpath, String fileName,

   String localPath) {

  // 初始表示下载失败

  boolean success = false;

  // 创建FTPClient对象

  FTPClient ftp = new FTPClient();

  ftp.setControlEncoding("UTF-8"); 

  try {

   int reply;

   // 连接FTP服务器

   // 如果采用默认端口,可以使用ftp.connect(ip)的方式直接连接FTP服务器

   ftp.connect(ip, port);

   // 登录ftp

   ftp.login(username, password);

   reply = ftp.getReplyCode();

   if (!FTPReply.isPositiveCompletion(reply)) {

    ftp.disconnect();

    return success;

   } 

   // 转到指定下载目录

   serverpath=gbkToIso8859(serverpath);

   ftp.changeWorkingDirectory(this.iso8859ToGbk(serverpath));

   // 列出该目录下所有文件

   FTPFile[] fs = ftp.listFiles();

   fileName=this.gbkToIso8859(fileName);

   localPath=this.gbkToIso8859(localPath);

   

   // 遍历所有文件,找到指定的文件

   for (FTPFile f : fs) {

    if (f.getName().equals(iso8859ToGbk(fileName))) {

     // 根据绝对路径初始化文件

     File localFile = new File(iso8859ToGbk(localPath) + "/" + f.getName());

     File localFileDir = new File(iso8859ToGbk(localPath));

     //保存路径不存在时创建

     if(!localFileDir.exists()){

      localFileDir.mkdirs();

     }

     // 输出流

     OutputStream is = new FileOutputStream(localFile);

     // 下载文件

     flag=ftp.retrieveFile(f.getName(), is);

     is.close();

    }

   }

   // 退出ftp

   ftp.logout();

   } catch (IOException e) {

   e.printStackTrace();

  } finally {

   if (ftp.isConnected()) {

    try {

     ftp.disconnect();

    } catch (IOException ioe) {

    }

   }

  }

  return success;

 }

 

 /**

  *  

  * 查找指定目录是否存在  不存在创建目录

  * 

  * @param FTPClient 

  *    ftpClient 要检查的FTP服务器

  * @param String 

  *    filePath 要查找的目录 

  * @return 

  *    boolean:存在:true,不存在:false 

  * @throws IOException 

  */

 private  boolean checkPathExist(FTPClient ftpClient, String filePath)

   throws IOException {

  boolean existFlag = false;

  try {

   if (filePath != null && !filePath.equals("")) {

    if (filePath.indexOf("/") != -1) {

     int index = 0;

     while ((index = filePath.indexOf("/")) != -1) {

      if (!ftpClient.changeWorkingDirectory(filePath.substring(0,index))) {

       ftpClient.makeDirectory(filePath.substring(0,index));

      }

      ftpClient.changeWorkingDirectory(filePath.substring(0,index));

      filePath = filePath.substring(index + 1, filePath.length());

     }

     if (!filePath.equals("")) {

      if (!ftpClient.changeWorkingDirectory(filePath)) {

       ftpClient.makeDirectory(filePath);

      }

     }

    } 

    existFlag = true;

   }

  } catch (Exception e) {

   e.printStackTrace();

  }

  return existFlag;

 }

 

 

 /**

  * 根据绝对路径获得文件名

  * @param file

  *      文件绝对路径 e.g: e.g: E:/log/log.txt OR E://log//log.txt

  * @return

  *      转码后的文件名 

  */

 private String getFilename(String file){

  //文件名

  String filename="";

  if(file!=null&&!file.equals("")){

   file=file.replaceAll(Matcher.quoteReplacement("//"), "/");

   String[] strs=file.split("/");

   filename=strs[strs.length-1];

  }

  filename=gbkToIso8859(filename);//转码

  return filename;

 }

 

 /** 

  * 转码[ISO-8859-1 ->  GBK] 

  * 不同的平台需要不同的转码 

  * @param obj 

  * @return 

  */

 private  String iso8859ToGbk(Object obj) {

  try {

   if (obj == null)

    return "";

   else

    return new String(obj.toString().getBytes("iso-8859-1"), "GBK");

  } catch (Exception e) {

   return "";

  }

 }

 

 /** 

  * 转码[GBK ->  ISO-8859-1] 

  * 不同的平台需要不同的转码 

  * @param obj 

  * @return 

  */

 private  String gbkToIso8859(Object obj) {

  try {

   if (obj == null)

    return "";

   else

    return new String(obj.toString().getBytes("GBK"), "iso-8859-1");

  } catch (Exception e) {

   return "";

  }

 }

 

 

代码说明:

向FTP服务器上传文件时调用uploadFile()方法,从FTP服务器下载文件时调用downFile()方法。

 

当然,想向FTP服务器上传文件,FTP服务器需要开写入权限。

 

需要用的jar是commons-net-2.0.jar。

 

 

分享到:
评论

相关推荐

    FTP服务器与客户端设计与实现

    FTP客户端是用户与服务器交互的工具,允许用户连接到FTP服务器并执行文件操作。它们通常具有图形用户界面(GUI)或命令行界面(CLI),如FileZilla Client、WinSCP、curl等。FTP客户端需要提供用户名和密码来验证...

    MFC实现FTP上传下载文件的客户端和服务器

    3. **文件传输**:FTP客户端可以通过`STOR`命令上传文件到服务器,使用`RETR`命令下载文件。MFC的`CFtpFileFind`类可以帮助查找服务器上的文件,而`CInternetFile`则用于读写文件。 4. **错误处理**:在FTP操作中,...

    FTP客户端与服务器的MFC实现

    总的来说,使用MFC实现FTP客户端与服务器涉及到网络编程、协议解析、文件操作、错误处理等多个方面。虽然MFC提供了一些便利的类和函数,但实际实现过程仍需要对FTP协议有深入理解,并具备良好的编程技巧和问题解决...

    LINUX上用C语言实现FTP客户端与服务器

    在Linux系统中,使用C语言实现FTP客户端与服务器是一项基础且重要的网络编程任务。FTP(File Transfer Protocol)是一种用于在互联网上传输文件的标准协议。通过C语言实现FTP客户端和服务器,我们可以深入理解网络...

    VC++ 实现FTP客户端与服务器

    在www.NewXing.com这个压缩包文件中,可能包含了实现FTP客户端和服务器的源代码示例,这对于理解和实践上述知识非常有帮助。你可以通过阅读和分析这些代码来加深理解,进一步提升你的VC++和网络编程技能。同时,不要...

    C#实现FTP客户端和服务器程序

    总的来说,C#提供了一套丰富的工具和库来实现FTP客户端和服务器程序,这使得开发者能够方便地构建自己的文件传输系统。在实际应用中,还需要考虑错误处理、多线程支持、性能优化以及安全性等方面的问题,以确保系统...

    QT5.7ftp客户端包含单文件上传下载及服务器文件删除

    QT5.7 FTP客户端是一个基于Qt库开发的用于FTP文件传输的应用程序,它支持基本的FTP操作,如单个文件的上传和下载,以及服务器端文件的删除功能。这个项目可能是一个独立的、轻量级的工具,适用于需要快速进行FTP操作...

    FTP客户端和服务器,ftp客户端和服务器有什么不同,Visual C++

    FTP客户端是用户用来连接到FTP服务器并执行文件操作的软件,如上传、下载、删除等。而FTP服务器则是接收客户端请求,处理文件操作,并向客户端返回结果的服务端程序。 在Visual C++环境下,开发FTP客户端和服务器...

    Ftp客户端与服务器

    在这个“Ftp客户端与服务器”的项目中,开发者使用Java语言实现了一个FTP服务器和两个不同界面的FTP客户端:一个图形界面客户端和一个命令行界面客户端。这些组件都是为了学习和理解FTP工作原理以及如何用Java编程...

    Delphi 实现FTP服务器与客户端源码

    在Delphi7中,开发者可以使用 Indy 或 Synapse 等第三方库来简化FTP协议的实现,它们提供了预封装的类和方法,帮助开发者快速构建FTP客户端和服务器。 综上所述,"Delphi 实现FTP服务器与客户端源码"这个项目涵盖了...

    FTP客户端与服务器的源代码

    FTP客户端是用户与FTP服务器交互的软件,它允许用户连接到远程服务器,上传、下载文件,或者执行其他管理操作。FTP客户端源代码的核心部分通常包括以下几个组件: 1. **连接管理**:客户端首先需要建立到服务器的...

    ftp客户端与服务器端编程

    在实现FTP客户端与服务器端的通讯时,主要涉及以下几个关键技术点: 1. TCP连接建立与管理:客户端首先通过TCP三次握手建立到服务器的控制连接。 2. FTP命令交互:客户端通过控制连接发送FTP命令,如`USER`、`PASS`...

    客户端服务器的文件传输

    客户端服务器的文件传输是计算机网络中的重要组成部分,它允许用户通过客户端应用程序将本地文件上传到远程服务器,或者从服务器下载文件到本地。这种技术广泛应用于数据共享、备份、协同工作和互联网服务,如云存储...

    FTP服务器与客户端程序(c++)

    在这个FTP服务器与客户端程序的项目中,我们主要关注两个核心组件:FTP服务器和FTP客户端。这两个组件通常由C++编程语言实现,因为C++提供了丰富的库支持和高效性能。 FTP服务器端: FTP服务器是网络上的一个服务,...

    JAVA实现FTP协议中的服务器和客户端\\

    在提供的压缩包文件中,"client"可能包含了实现FTP客户端的示例代码。通过研究这些代码,你可以更好地理解Java如何实现FTP客户端的逻辑,包括如何建立连接、发送命令和处理响应。 总之,使用Java实现FTP服务器和...

    java ftp客户端,服务端

    要实现FTP客户端,首先需要创建一个Socket连接到FTP服务器,然后通过输入输出流(InputStream和OutputStream)进行数据交互。客户端通常需要执行的操作包括登录、改变工作目录、列出目录内容、上传和下载文件等。 ...

    FTP客户端与服务器实现

    在这个项目中,我们关注的是使用C语言实现FTP客户端和服务器的功能,特别强调了断点续传的能力,这在大文件传输中非常实用。服务端部分是设计在Linux操作系统上的,这意味着它利用了Unix-like系统的特性和丰富的...

    基于lwip的ftp客户端代码

    FTP 客户端的主要任务是与 FTP 服务器建立连接,进行身份验证,发送文件传输请求,并接收或上传文件。在 lwip 中,这涉及到以下几个关键步骤: 1. **网络初始化**:首先,需要配置 lwip,设置网络接口,如 IP 地址...

    基于Win socket简单实现一个FTP协议的客户端和服务器

    实现一个FTP协议的客户端和服务器,完成基本的文件传输功能。 功能: (1) 多客户端访问。 (2) 在获取文件之前能够先得到文件列表。 (3)实现FTP文件的上传与下载. (4) GUI(界面实现)。

Global site tag (gtag.js) - Google Analytics