- 浏览: 188872 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
iblike:
给我发一份,谢谢哦,iblike@163.com
Java实现的IP地址查询 - 性能不逊色于C -
编程的石头:
还可以再优化,你把地址库作一个分段,如1.1.1.1~63.1 ...
Java实现的IP地址查询 - 性能不逊色于C -
上官车月:
哥们 头像逆天啊
java Map排序(按key和按value) -
hwhwl:
给我也发一下吧 hwhwl@jpw.cn 我也需要这个
Java实现的IP地址查询 - 性能不逊色于C -
Longerandlonger:
return (o2.getValue() - o1.getV ...
java Map排序(按key和按value)
package com.wwkj.cms.test.ftp; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.SocketException; import java.text.SimpleDateFormat; import java.util.Comparator; import java.util.Properties; import java.util.TreeSet; import org.apache.commons.io.FileUtils; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPClientConfig; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import com.wwkj.cms.framework.log.LoggerAdapter; /** * 实现FTP 客户端的各种操作 * * 其实JDK里面也有支持FTP操作的包【jre/lib下的rt.jar】,但是SUN的DOC里面并没有提供相应文档, * 因为这里面的包,不被官方支持,建议不要使用。我们可以使用第三方提供的包apache.commons。 apache.commons的包,都有文档,方便使用 * 另外IBM也有提供一个ftp包,我没有用过,有兴趣的可以去研究一下 * * @commons-net:http://apache.mirror.phpchina.com/commons/net/binaries/commons-net-1.4.1.zip * @jakarta-oro:http://mirror.vmmatrix.net/apache/jakarta/oro/source/jakarta-oro-2.0.8.zip * @commons-io:http://apache.mirror.phpchina.com/commons/io/binaries/commons-io-1.3.2-bin.zip * * @author 高新强 * @version 2008-06-10 Ftp.java * */ public class Ftp { private static LoggerAdapter logger; /** * FTP 登录用户名 */ private static String UserName; /** * FTP 登录密码 */ private static String Password; /** * FTP 服务器地址IP地址 */ private static String Ip; /** * FTP 端口 */ private static int Port; /** * 属性集 */ private static Properties Property = null; /** * 配置文件的路径名 */ private static String ConfigFile = "src/com/wwkj/cms/test/ftp/ftpconfig.properties"; /** * FTP 客户端代理 */ private static FTPClient FtpClient = null; /** * 时间格式化 */ private static SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd hh:mm"); /** * FTP */ private static final String[] FILE_TYPES = { "文件", "目录", "符号链接", "未知类型" }; /** * 传输模式为二进制文件. */ public static final int BINARY_FILE_TYPE = FTP.BINARY_FILE_TYPE; /** * 传输模式为ASCII,默认为ASCII */ public static final int ASCII_FILE_TYPE = FTP.ASCII_FILE_TYPE; public static int i=1; public static void main(String[] args) { // setConfigFile("ftpconfig.properties");// 设置配置文件路径 connectServer(); // makeDirectory("eeee"); // changeWorkingDirectory("webroot");//进入文件夹webroot // listRemoteFiles("*.jsp");//列出webroot目录下所有jsp文件 setFileType(FTP.BINARY_FILE_TYPE);// 设置传输二进制文件 //uploadFile("G:/临时文件/万维公司员工交通通讯报销标准(2008修订版).doc", // "中国人也/万维公司员工交通通讯报销标准(2008修订版).doc");// // 上传文件woxingwosu.xml,重新命名为myfile.xml // renameFile("viewDetail.jsp", // "newName.jsp");//将文件viewDetail.jsp改名为newName.jsp uploadManyFile("G:/临时文件/staxmem", "dirdirdir/"); // deleteFile("/testtest/");//删除一个文件UpdateData.class // deleteEmptyDirectory("dfd");// // loadFile("jakarta-oro-2.0.8.jar", "E:/tmp/00000000000000001.jpg");// // 01.jpg,并且重新命名为G:/临时文件/00000000000000001.jpg // uploadFile("G:/临时文件"); // listRemoteFiles("eeee");// 列出所有文件和目录 // listRemoteFiles("58-20166.jpg");// 列出指定的文件和目录 closeConnect();// 关闭连接 } /** * 上传单个文件,并重命名 * * @param localFilePath--本地文件路径 * @param newFileName--新的文件名,可以命名为空"" * @return true 上传成功,false 上传失败 */ public static boolean uploadFile(String localFile, String newFileName) { boolean flag = true; try { connectServer(); FtpClient.setFileType(BINARY_FILE_TYPE); // ftp.setFileType(FTP.ASCII_FILE_TYPE); FtpClient.enterLocalPassiveMode(); // ftp.changeWorkingDirectory(remoteDir); FtpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE); File file = new File(localFile); File newFile = new File(newFileName); String dir = newFile.getParentFile().getPath(); if (!FtpClient.changeWorkingDirectory(dir)) {// 如果不能进入dir下,说明此目录不存在! if (!makeDirectory(newFile.getParentFile().getPath())) { System.out.println("创建文件目录【" dir "】 失败!"); } } changeWorkingDirectory("/");// 回到FTP根目录 InputStream input = new FileInputStream(file); if (input == null) { System.out.println("本地文件不存在"); logger.debug("本地文件不存在,请重新选择!"); } if (newFileName.trim().equals("")) { newFileName = file.getName(); } flag = FtpClient.storeFile(newFileName, input); if (flag) { System.out.println("upload File succeed"); } else { System.out.println("upload File false"); } input.close(); } catch (IOException e) { e.printStackTrace(); logger.debug("本地文件上传失败!", e); // TODO: handle exception } catch (Exception e) { e.printStackTrace(); // logger.debug("本地文件上传失败!", e); // TODO: handle exception } return flag; } /** * 上传多个文件 * * @param localFilePath--本地文件夹路径 * @return true 上传成功,false 上传失败 */ public static String uploadManyFile(String localFile) { boolean flag = true; StringBuffer strBuf = new StringBuffer(); int n = 0; try { connectServer(); File file = new File(localFile);// 在此目录中找文件 File file2[] = file.listFiles(); for (int i = 0; i < file2.length; i ) { File file1 = new File(file2[i].getAbsolutePath()); if (file1.isDirectory()) {// 文件夹中还有文件夹 uploadManyFile(file2[i].getAbsolutePath()); } else { flag = uploadFile(file2[i].getAbsolutePath(), ""); } if (!flag) { n ; strBuf.append(file2[i].getName() "\r\n"); } } if (n > 0) { strBuf.insert(0, "共有" n "上传失败,分别为\r\n"); } System.out.println(strBuf.toString()); } catch (NullPointerException e) { e.printStackTrace(); // logger.debug("本地文件上传失败!找不到上传文件!", e); // TODO: handle exception } catch (Exception e) { e.printStackTrace(); logger.debug("本地文件上传失败!", e); // TODO: handle exception } return strBuf.toString(); } /** * 上传多个文件 * * @param localFilePath--本地文件夹路径 * @param newFileName--目标路径 * @return true 上传成功,false 上传失败 */ public static String uploadManyFile(String localFile, String newFileName) { boolean flag = true; StringBuffer strBuf = new StringBuffer(); int n = 0; try { connectServer(); File file = new File(localFile);// 在此目录中找文件 File file2[] = file.listFiles(); for (int i = 0; i < file2.length; i ) { File file1 = new File(file2[i].getAbsolutePath()); System.out.println(file1.isFile()); if (file1.isDirectory()) {// 文件夹中还有文件夹 uploadManyFile(file2[i].getAbsolutePath(), newFileName); } else { String tmpNewFileName = ""; if (newFileName.substring(newFileName.length() - 1).equals( "/")) { tmpNewFileName = newFileName file2[i].getName(); } else { tmpNewFileName = newFileName "/" file2[i].getName(); } System.out.println(tmpNewFileName); flag = uploadFile(file2[i].getAbsolutePath(), tmpNewFileName); } if (!flag) { n ; strBuf.append(file2[i].getName() "\r\n"); } } if (n > 0) { strBuf.insert(0, "共有" n "上传失败,分别为\r\n"); } System.out.println(strBuf.toString()); } catch (NullPointerException e) { e.printStackTrace(); logger.debug("本地文件上传失败!找不到上传文件!", e); // TODO: handle exception } catch (Exception e) { e.printStackTrace(); logger.debug("本地文件上传失败!", e); // TODO: handle exception } return strBuf.toString(); } /** * 下载文件 * * @param remoteFileName * --服务器上的文件名 * @param localFileName--本地文件名 * @return true 下载成功,false 下载失败 * */ public static boolean loadFile(String remoteFileName, String localFileName) { boolean flag = true; connectServer(); // 下载文件 BufferedOutputStream buffOut = null; try { buffOut = new BufferedOutputStream(new FileOutputStream( localFileName)); flag = FtpClient.retrieveFile(remoteFileName, buffOut); } catch (Exception e) { e.printStackTrace(); logger.debug("本地文件下载失败!", e); } finally { try { if (buffOut != null) buffOut.close(); } catch (Exception e) { e.printStackTrace(); } } return flag; } /** * 删除一个文件 */ public static boolean deleteFile(String filename) { boolean flag = true; try { connectServer(); flag = FtpClient.deleteFile(filename); if (flag) { System.out.println("delete File succeed"); } else { System.out.println("delete File false"); } } catch (IOException ioe) { ioe.printStackTrace(); } return flag; } /** * 删除目录 */ public static void deleteDirectory(String pathname) { try { connectServer(); File file = new File(pathname); if (file.isDirectory()) { File file2[] = file.listFiles(); } else { deleteFile(pathname); } FtpClient.removeDirectory(pathname); } catch (IOException ioe) { ioe.printStackTrace(); } } /** * 删除空目录 */ public static void deleteEmptyDirectory(String pathname) { try { connectServer(); FtpClient.removeDirectory(pathname); } catch (IOException ioe) { ioe.printStackTrace(); } } /** * 列出服务器上文件和目录 * * @param regStr * --匹配的正则表达式 */ @SuppressWarnings("unchecked") public static void listRemoteFiles(String regStr) { connectServer(); try { // FtpClient.changeWorkingDirectory(regStr); String files[] = FtpClient.listNames(regStr); if (files == null || files.length == 0) System.out.println("There has not any file!"); else { for (int i = 0; i < files.length; i ) { System.out.println(files[i]); } } } catch (Exception e) { e.printStackTrace(); } } /** * 列出Ftp服务器上的所有文件和目录 * */ public static void listRemoteAllFiles() { connectServer(); try { String[] names = FtpClient.listNames(); for (int i = 0; i < names.length; i ) { System.out.println(names[i]); } } catch (Exception e) { e.printStackTrace(); } } /** * 关闭连接 */ public static void closeConnect() { try { if (FtpClient != null) { FtpClient.logout(); FtpClient.disconnect(); } } catch (Exception e) { e.printStackTrace(); } } /** * 设置配置文件 * * @param configFile */ public static void setConfigFile(String configFile) { Ftp.ConfigFile = configFile; } /** * 设置传输文件的类型[文本文件或者二进制文件] * * @param fileType--BINARY_FILE_TYPE、ASCII_FILE_TYPE */ public static void setFileType(int fileType) { try { connectServer(); FtpClient.setFileType(fileType); } catch (Exception e) { e.printStackTrace(); } } /** * 扩展使用 * * @return */ protected static FTPClient getFtpClient() { connectServer(); return FtpClient; } /** * 设置参数 * * @param configFile * --参数的配置文件 */ private static void setArg(String configFile) { Property = new Properties(); BufferedInputStream inBuff = null; try { File file = new File(configFile); inBuff = new BufferedInputStream(new FileInputStream(file)); Property.load(inBuff); UserName = Property.getProperty("username"); Password = Property.getProperty("password"); Ip = Property.getProperty("ip"); Port = Integer.parseInt(Property.getProperty("port")); } catch (FileNotFoundException e1) { System.out.println("配置文件 【" configFile "】不存在!"); e1.printStackTrace(); } catch (IOException e) { System.out.println("配置文件 【" configFile "】无法读取!"); e.printStackTrace(); } /* * } catch (Exception e) { e.printStackTrace(); } finally { try { if * (inBuff != null) inBuff.close(); } catch (Exception e) { * e.printStackTrace(); } } */ } /** * 连接到服务器 * * @return true 连接服务器成功,false 连接服务器失败 */ public static boolean connectServer() { boolean flag = true; if (FtpClient == null) { int reply; try { setArg(ConfigFile); FtpClient = new FTPClient(); FtpClient.setControlEncoding("GBK"); FtpClient.setDefaultPort(Port); FtpClient.configure(getFtpConfig()); FtpClient.connect(Ip); FtpClient.login(UserName, Password); FtpClient.setDefaultPort(Port); //System.out.print(FtpClient.getReplyString()); reply = FtpClient.getReplyCode(); FtpClient.setDataTimeout(120000); if (!FTPReply.isPositiveCompletion(reply)) { FtpClient.disconnect(); System.err.println("FTP server refused connection."); // logger.debug("FTP 服务拒绝连接!"); flag = false; } System.out.println(i); i ; } catch (SocketException e) { flag = false; e.printStackTrace(); System.err.println("登录ftp服务器【" Ip "】失败,连接超时!"); // logger.debug("登录ftp服务器【" Ip "】失败"); } catch (IOException e) { flag = false; e.printStackTrace(); System.err.println("登录ftp服务器【" Ip "】失败,FTP服务器无法打开!"); // logger.debug("登录ftp服务器【" Ip "】失败"); } } return flag; } /** * 进入到服务器的某个目录下 * * @param directory */ public static void changeWorkingDirectory(String directory) { try { connectServer(); FtpClient.changeWorkingDirectory(directory); } catch (IOException ioe) { ioe.printStackTrace(); } } /** * 返回到上一层目录 */ public static void changeToParentDirectory() { try { connectServer(); FtpClient.changeToParentDirectory(); } catch (IOException ioe) { ioe.printStackTrace(); } } /** * 重命名文件 * * @param oldFileName * --原文件名 * @param newFileName * --新文件名 */ public static void renameFile(String oldFileName, String newFileName) { try { connectServer(); FtpClient.rename(oldFileName, newFileName); } catch (IOException ioe) { ioe.printStackTrace(); } } /** * 设置FTP客服端的配置--一般可以不设置 * * @return */ private static FTPClientConfig getFtpConfig() { FTPClientConfig ftpConfig = new FTPClientConfig( FTPClientConfig.SYST_UNIX); ftpConfig.setServerLanguageCode(FTP.DEFAULT_CONTROL_ENCODING); return ftpConfig; } /** * 转码[ISO-8859-1 -> GBK] 不同的平台需要不同的转码 * * @param obj * @return */ private static String iso8859togbk(Object obj) { try { if (obj == null) return ""; else return new String(obj.toString().getBytes("iso-8859-1"), "GBK"); } catch (Exception e) { return ""; } } /** * 在服务器上创建一个文件夹 * * @param dir * 文件夹名称,不能含有特殊字符,如 \ 、/ 、: 、* 、?、 "、 <、>... */ public static boolean makeDirectory(String dir) { connectServer(); boolean flag = true; try { // System.out.println("dir=======" dir); flag = FtpClient.makeDirectory(dir); if (flag) { System.out.println("make Directory " dir " succeed"); } else { System.out.println("make Directory " dir " false"); } } catch (Exception e) { e.printStackTrace(); } return flag; } public LoggerAdapter getLogger() { return logger; } public void setLogger(LoggerAdapter logger) { this.logger = logger; } }
一, 文件名中文乱码问题.
开始知道能用FTPClient的listNames方法得到当前目录下所有文件的列表. 但是发现中文文件名是乱码. 默认情况下FTPClient使用UTF-8字符集作为和服务器通讯的编码集. 而我们的ftp服务器是在中文windowsXP上装的ServU. 所有使用GBK做为通讯编码集. 经过查找api文档, 我看到了setControlEncoding方法, 试了一下,果然好使. 于是这个问题就解决了:
第8行: ftp.setControlEncoding("GBK")
至于conf.setServerLanguageCode("zh")对这个有什么影响,我还没有验证. 但是只有这句是不行的.
二, 传输binary文件, 由于FTPClient默认使用ASCII作为传输模式, 所有不能传输二进制文件. 通过
ftp.setFileType(FTP.BINARY_FILE_TYPE)个可以解决这个问题, 但是要在login以后执行. 因为这个方法要向服务器发送"TYPE I"命令.
开始的时候用的是setFileTransferMode, 不过不好使. 它会执行 MODE I命令, 服务器不接受.
三, 用被动模式传输: enterLocalPassiveMode()这个到不用在login之后执行, 因为它只改变FTPClient实例的内部属性.
四, 断点续传. 心想应该有支持吧, 于是查API结果找到了setRestartOffset()方法, 试了一下,果真好使. 用RandomAccessFile配合使用, 实现起来还是蛮简单的.
五, 只能传一个文件!!
不 知道大家有没有遇到这个问题, 传输第一个文件好使, 后面的的retrieveFileStream(name)都是返回null. 这个实在是令人头痛的问题, 难不成要传一个文件重新建立一次连接? 那样也太土了吧. 但是文档里也没有写, 来点狠的,debug它的源码, 看看它究竟做了什么事情. 首先看一下ftp服务器的日志, 发现日志没问题, 过来的命令和reply都是正确的, 但是发现第一个文件以后没有执行RETR命令. 于是跟踪PASV命令的reply代码,发现不是227,而服务器上的日志明明返回的是227. 难道是FTPClient解析Reply出问题了. 进一步跟踪发现了问题, 原来在一个文件传输过程中会产生两个Reply:
150 Opening BINARY mode data connection for a.sql (19890 Bytes).
226 Transfer complete.
而FTPClient 自动消费掉一个,于是解析Reply就发生了错位, 下一个命令的会解析266那条. 接下来的命令都不是解析自己的Reply而是前一次命令的. 所有在PASV命令的Reply码就不对了, FTPClient也就不会执行接下来本应该执行RETR命令.
他不消费,我们来消费吧. 于是在文件传输完成以后, 主动调用一次getReply()把接下来的226消费掉. 这样做是可以解决这个暂时的问题, 但不知道在其他的ftp操作上会不会也有类似的情况. FTPClient这点可做的不大好.
对于上面这个问题, 我本来想修改一下FTPClient这个类来彻底解决问题. 结果发现自己也想不出好办法. 最后还是放弃了.
今天才发现,原来FTPClient有个completePendingCommand()方法就是用来干这件事情的!
ftpClient.setControlEncoding("gbk"); //设置编码格式,解决中文名问题
ftpClient.enterLocalPassiveMode(); //被动模式,解决部分ftp目录无法加载问题
ftpClient.printWorkingDirectory(); //当前工作目录
ftpClient.changeToParentDirectory(); //切换到上级目录
ftpClient.changeWorkingDirectory(path); //切换到指定目录
转载自:http://xiaoqiangg.bokee.com/viewdiary.32670371.html
发表评论
-
JAXB 使用线程安全问题
2013-06-05 16:24 3538JAXB是一个 java bean与xml之间相互转换的非 ... -
Hashtable、HashMap区别,还是看源码印象深刻
2011-11-07 18:49 1121以前都是看别人谈 今天又想起这个问题,然后就自己看了看具体实 ... -
使用javamelody监控应用程序
2011-06-21 00:26 2228今天在网上看到开源的应用系统监控插件JavaMelody,ht ... -
IM4Java生成缩略图
2011-04-25 23:26 0了解了java自带的生成缩略图功能,以及一些纯java写的生成 ... -
Just For Easy 独家推出在线源码
2011-03-19 12:08 2076前几天发了一篇 Just For Easy 国内在线API,更 ... -
Just For Easy 国内在线API,更速度
2011-03-13 14:55 3710启用QQ 交流群:144615883,欢迎大家 加入交流。。。 ... -
利用JProfile检测Linux上Tomcat的内存泄露
2011-02-23 11:10 4116公司一系统开发完成上线后,经常出现系统宕机现象。开发环境MyE ... -
java Map排序(按key和按value)
2011-01-14 12:03 436761、按照key排序 对于java中Map的排序,有排序 ... -
【收藏】java中静态方法和非静态方法的存储
2010-10-28 10:53 3241将某 class 产生出一个 instance 之后,此 ... -
可爱的Jetty - tomcat的可能终结者
2010-09-20 14:50 3442有机会开始接触了一下Jetty,发现果然是好用,有一种相见恨晚 ... -
Java实现的IP地址查询 - 性能不逊色于C
2010-03-17 20:58 5435看到很多网站提供IP地址查询的服务,当时就想如此庞大的IP数据 ... -
HttpClient学习整理
2009-12-05 23:32 911HttpClient 学习整理 ... -
用POI的HSSF来控制EXCEL的研究
2009-11-16 12:37 8081.创建工作簿 (WORKBOOK) HSSFWorkb ... -
Java 异步消息处理
2009-09-09 15:10 1183发现javaeye上的一个转载少了很多东西,重新转载一下,这个 ... -
J2EE架构师手册中文 第一章
2009-09-04 11:19 0之前看到javaeye上有这么一个博客是翻译的这个, ... -
Nutch中MapReduce的分析
2009-08-09 10:22 1453作者:马士华 发表于:2008-03-06 20:11 最后更 ... -
birt动态报表参数的设置
2009-08-08 16:54 4649对于前面的sql语句已经写好,看看里面有几个?, ... -
birt初体验
2009-08-07 22:11 941这几天才开始看这个东西,还是很不错的,对于普通的报表的设计任务 ... -
让hibernate支持date_add
2009-08-07 21:55 2486今天做东西的时候想去查找某一天的记录数据,如果用单独的sql语 ... -
Apache和Subversion集成安装与配置
2009-08-04 20:37 867因为工作需要,要架设一个Subversion和Apache一起 ...
相关推荐
基于openssl的ftp文件传输系统源码基于openssl的ftp文件传输系统源码基于openssl的ftp文件传输系统源码基于openssl的ftp文件传输系统源码基于openssl的ftp文件传输系统源码基于openssl的ftp文件传输系统源码基于...
综上所述,"Ftp.rar_ftp_ftp 文件传输_ftp文件传输_文件传输界面_界面端传输"这个主题涉及到的FTP文件传输系统,不仅包括了FTP协议的核心功能,还强调了其用户友好的界面设计,使得文件在局域网内的传输变得简单快捷...
在IT领域,FTP(File Transfer Protocol)是一种广泛用于在互联网上传输文件的协议。这个“C++简单的FTP文件传输”项目旨在为初学者提供一个学习基础FTP文件传输原理的平台。通过这个项目,你可以了解如何使用C++...
因此,现代的FTP应用常常使用FTPS(FTP over TLS/SSL)或SFTP(SSH文件传输协议)来提供安全的传输。然而,本项目未提及安全协议,可能仅实现了基础的FTP功能。 在VC++中实现FTP程序还需要注意错误处理,包括网络...
FTP(File Transfer Protocol)是一种基于TCP/IP协议的网络协议,用于在网络上进行文件传输。C语言实现FTP文件传输功能,涉及到的知识点广泛,包括但不限于网络编程、C语言编程基础、TCP/IP套接字编程以及文件操作等...
Labview FTP上传文件是利用Labview(Laboratory Virtual Instrument Engineering Workbench)这一强大的图形化编程环境,通过FTP(File Transfer Protocol)协议实现文件的远程传输。FTP是一种标准网络协议,用于在...
5. **安全性**:FTP本身并不提供加密,因此在传输敏感数据时,通常会使用FTP over TLS/SSL(FTPS)或SFTP(SSH文件传输协议)来增强安全性。在源码中实现这些安全特性需要额外的加密库支持。 6. **文件列表解析**:...
Java实现FTP文件传输涉及到多个关键知识点,包括FTP协议的基本概念、Java中的FTP客户端库、以及如何使用Java进行文件操作。以下是对这些知识点的详细说明: 1. FTP协议:FTP(File Transfer Protocol)是一种用于在...
FTP(File Transfer Protocol)文件传输协议是互联网上用于在不同计算机之间交换文件的标准协议。它允许用户通过网络从远程服务器上传、下载文件,或者管理服务器上的文件。在本课设中,我们将使用Java编程语言来...
FTP(File Transfer Protocol)文件传输协议是互联网上广泛使用的文件传输机制,用于在不同系统间交换文件。FTP提供了交互式的访问方式,允许用户指定文件类型、格式,并处理存取权限,同时隐藏了不同计算机系统的...
FTP(File Transfer Protocol)文件传输协议是互联网上用于在不同计算机之间交换文件的标准协议。它允许用户通过网络从远程服务器上传、下载文件。在“FTP文件传输课程设计”项目中,我们通常会学习如何实现一个基本...
开发者可能使用FTP API或库,如libcurl,来封装FTP通信逻辑,然后在PowerBuilder中调用这些接口。 学习和理解这个FTP文件传输源代码可以帮助你掌握FTP协议的工作原理,了解如何在实际项目中实现文件传输功能,以及...
FTP利用TCP的这些特性来保证文件传输的准确性和完整性。 在基于TCP的FTP文件传输系统中,主要涉及以下几个关键知识点: 1. **TCP连接建立与关闭**:FTP服务在开始传输前会通过三次握手建立TCP连接,确保双方都有...
1. FTP协议基础:FTP使用TCP作为传输层协议,通过建立两个独立的连接来完成文件传输,分别是控制连接和数据连接。控制连接用于发送命令和接收响应,数据连接则用于实际的数据传输。 2. 用户认证:FTP支持匿名登录和...
FTP(File Transfer Protocol)文件传输协议是互联网上用于在不同计算机之间交换文件的标准协议。C语言作为基础的编程语言,可以用来实现FTP客户端和服务器端的功能。本项目中,我们探讨了如何用C语言实现FTP的基本...
在描述中提到,“文件大于>100G也好用”,这表明我们讨论的FTP工具能够处理大文件传输,对于大型项目或数据备份非常实用。大文件传输通常需要更稳定和高效的技术支持,例如断点续传功能。断点续传允许用户在传输中断...
基于FTP的文件传输涉及到的主要知识点包括FTP的工作原理、FTP客户端与服务器之间的交互、FTP命令以及如何使用编程语言实现FTP功能。 FTP工作原理: FTP基于TCP/IP协议栈,通过两个独立的连接来完成文件传输:控制...
实现FTP文件传输
FTP(File Transfer Protocol)文件传输协议是互联网上用于在不同计算机之间进行文件交换的标准协议。基于JAVA的FTP网络编程主要涉及两个部分:FTP服务器端的实现和FTP客户端的开发。在Java中,我们可以利用Sun.net...