java中的ftp4j是个不错的框架,可以用于java实现ftp的一些操作。 
这个框架已经实现了ftp的功能,如果需要移植到android,就需要一些界面元素与后台进程。 
android这样直接利用现在的java框架完成一些事情是比较容易的。 
ftp4j的文档还是蛮全的,而且容易读懂。

使用方法:

FTPClient client = new FTPClient();
client.connect("ftp.host.com", 8021);
client.login("carlo", "mypassword");
没有异常表示连接成功,否则会垫子抛出FTPException异常。
当然还有一些重载方法,如果端口为21就可以用client.connect(host);

为了处理匿名的登录,可以client.login("anonymous", "ftp4j");,用户名是anonymous,密码随意。

登录之后需要对服务器进行操作,如目录显示,进入等;
String dir = client.currentDirectory(); 显示当前目录
修改进入的目录
client.changeDirectory(newPath);
可以使用相对路径,也可以使用绝对路径,下面两种都可以。
client.changeDirectory("/an/absolute/one");
client.changeDirectory("relative");
如果只想进入上一层:client.changeDirectoryUp();

ftp4j中有两个特别目录“.","..",分别表示根目录与上一层目录。

重命名:client.rename("oldname", "newname");
或移动文件:client.rename("myfile.txt", "myfolder/myfile.txt");
删除文件:client.deleteFile(relativeOrAbsolutePath);可以使用相对或绝对路径。
创建目录:client.createDirectory("newfolder");
删除目录:client.deleteDirectory(absoluteOrRelativePath);

显示文件,目录,链接
由于服务器的不同,所以返回的文件列表格式也不同,可能是UNIX,也可能是WIN的。ftp4j目录支持:
UNIX style and variants (i.e. MAC style)
DOS style
NetWare styles
EPLF
MLSD

.显示当前的目录文件:FTPFile[] list = client.list();
FTPFile包含了所需要的信息,从type可以知道是目录还是文件,或链接。
除此外还可以过滤:
FTPFile[] list = client.list("*.jpg");过滤了,只显示图片

如果想知道修改上期,需要单独获取,不能从上面的list()方法得到:
java.util.Date md = client.modifiedDate("filename.ext");

接下来就是上传与下载了:
client.download("remoteFile.ext", new java.io.File("localFile.ext"));
client.upload(new java.io.File("localFile.ext"));
追加内容的上传
client.append(new java.io.File("localFile.ext"));
这些是阻塞方法,只有在完成后才返回,所以一个FTPClient只能在同时进行一个传输。如果你想多个文件同时传输,可以使用多个FTPClient,FTPClient单独连接服务器。

当今的软件不能只是功能上实现了,还需要注意用户体验,所以上传下下载需要知道进度,ftp4j都通过FTPDataTransferListener这个接口来实现的,如果有一个方法:
public void transferred(int length) {
// Yet other length bytes has been transferred since the last time this
这个方法是说在距上一次传输到这一次传输的内容多少,
如果要有一个进度条,需要知道总量,然后当前传输的量,所以需要进行一些处理,如在开始上传时,获取本地文件上传大小,然后从这个接口中得到已经传输的文件叠加起来得到已经传输文件总量的大小,再计算得到进度。

从FTPClient中可以知道:在上传时:listener.transferred(l);l表示这次传输的量,但这似乎不是我们想要的,
修改为:listener.transferred(done);这个done表示的是上传的总量,是已经存在的,直接使用就好了。
}

然后就可以通过重载方法加入这个监听器client.download("remoteFile.ext", new java.io.File("localFile.ext"), new MyTransferListener());,其它略了。

对同一个FTPClient,多个线程间的操作是有影响的,如可以在其它线程中调用abortCurrentDataTransfer()来结当前的传输行为。
这个方法传入 false表示突然停止,传入true表示发送ABOR命令,是个合法的结束。然后会有FTPAbortedException异常。

ftp4j还支持断点:
client.download("remoteFile.ext", new java.io.File("localFile.ext"), 1056);表示从1057开始,前面的不需要再传输了。
上传也类似 。

主动与被动的传输:
主动的传输行为:
客户端发送ip地址与端口号到服务器
客户端请求服务器传输数据,开始监听端口
服务器连接地址与端口
数据传输由一个新的通道开始传输。
主动的需要客户端支持接收信息如果客户端有防火墙,代理等,会有些问题,

被动的传输行为:
客户端请求服务器准备被动的数据传输。
服务器回复并带有ip与端口。
客户端请求传输也连接。
数据传输由一个新的通道开始传输。

通过以下方式改变:
client.setPassive(false); // Active mode
client.setPassive(true); // Passive mode
默认是被动的。
这些属性可以通过系统属性来设置 :
如ftp4j.activeDataTransfer.acceptTimeout设置超时时间:
java -Dftp4j.activeDataTransfer.hostAddress=178.12.34.167
     -Dftp4j.activeDataTransfer.portRange=6000-7000
     -Dftp4j.activeDataTransfer.acceptTimeout=5000 MyClass

Set property values directly in the code. I.e.:
System.setProperty("ftp4j.activeDataTransfer.hostAddress", "178.12.34.167");
System.setProperty("ftp4j.activeDataTransfer.portRange", "6000-7000");
System.setProperty("ftp4j.activeDataTransfer.acceptTimeout", "5000");

二进制与文本传输类型:
从源码可以看出是以后缀名来判断文件的类型,所以个人认为,上传的文件需要自己知道什么类型的,不小心将二进制文件改为txt后缀,可能会有些问题。
client.setType(FTPClient.TYPE_TEXTUAL);
client.setType(FTPClient.TYPE_BINARY);
client.setType(FTPClient.TYPE_AUTO);
当然它提供了一些自定义的类型client.setTextualExtensionRecognizer(myRecognizer);

一些服务器支持数据压缩传输,叫MODE Z。可以通过client.setCompressionEnabled(true);打开,在这之前可以确认:boolean compressionEnabled = client.isCompressionEnabled();

站点规范与命令:
FTPReply reply = client.sendSiteCommand("YOUR COMMAND");
也可以自定义命令
FTPReply reply = client.sendCustomCommand("YOUR COMMAND");
都返回一个FTPReply对象。可以从这个对象得到一些返回代码,信息等内容。

-----------------------------------------------
上面是ftp4j的文档的一些知识。有了以上知识,开发一个android客户端就相对容易多了。
如我想得到服务器的文件目录操作(选择文件,选择目录,进入目录)
就可以使用ListView+ListAdapter显示目录与文件,然后由于 android的操作可以使用OnItemLongClickListener长按与短按OnItemClickListener分别指定一些操作,如短按可以选择为进入目录:
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            FTPFile ftpFile=mFileList.get(i);
            String filename=ftpFile.getName();
            if ("..".equals(filename)) {
                Log.d(TAG, "change directory up.");
                changeDirectoryUp();
            } else if (".".equals(filename)) {
                Log.d(TAG, "change directory root");
                changeDirectory("/");
            } else {
                if (ftpFile.getType()==FTPFile.TYPE_DIRECTORY) {
                    Log.d(TAG, "change directory:"+filename);
                    changeDirectory(filename);
                }
            }
        }

mFtpClient.changeDirectory(path);
mFtpClient.changeDirectoryUp();就是上面最终调用的方法。
然后在长按中:
FTPFile ftpFile=mFileList.get(i);
            String filename=ftpFile.getName();
            if ("..".equals(filename)||".".equals(filename)) {
                Log.d(TAG, "在这里没有处理");
            } else {
                if (ftpFile.getType()==FTPFile.TYPE_DIRECTORY) {
                    Log.d(TAG, "change directory:"+filename);
                    selectDirectory(filename);
                }
            }
selectDirectory()方法就是作为选中目录上传目的地。然后可以将本地文件传入这个目录。
在改变目录后调用:
private void refreshFiles(FTPClient mFtpClient) throws IOException, FTPIllegalReplyException, FTPException {
        FTPFile[] files=new FTPFile[0];
        try {
            files=mFtpClient.list();
            List<FTPFile> ftpFiles=(List<FTPFile>) Arrays.asList(files);
            mFileList.clear();
            mFileList.addAll(ftpFiles);
            Message message=Message.obtain(mHandler, REFRESH_FILE);
            message.obj=mFtpClient.currentDirectory();
            mHandler.sendMessage(message);
//这里就是刷新ListView。
        } catch (FTPDataTransferException e) {
            e.printStackTrace();
        } catch (FTPAbortedException e) {
            e.printStackTrace();
        } catch (FTPListParseException e) {
            e.printStackTrace();
        }
    }

提供了上传下载的功能后,就可以使用它了,建立一个简单的ftp服务器,HOMEftpserver就是个不错的东西,然后拍照或录像再上传。

android 下 ftp 客户端软件编写(ftp4j)相关推荐

  1. 一款不错的Linux命令行下的FTP客户端软件

    [文章作者:张宴 本文版本:v1.0 最后修改:2008.12.12 转载请注明原文链接: http://blog.s135.com/post/387/] 一款Linux命令行下的FTP客户端软件── ...

  2. 基于java的ftp客户端_基于Java的FTP客户端软件的设计

    基于的FTP客户端软件的设计(含选题审批表,任务书,开题报告,中期检查表,毕业论文8600字,答辩记录) 摘 要:FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中 ...

  3. CentOS/用FTP客户端软件连接到服务器

    在用ProFTPD构建FTP服务器的时候,为了全力保证文件传输时的安全,我们对FTP服务器进行了尽可能保密.安全的配置.比如TLS,并为服务器建立证书(SSL)等等的手段.这也决定了,在这些条件下,F ...

  4. ftp客户端软件,8款最受欢迎的ftp客户端软件

    对于ftp客户端软件,你了解多少?其实一般人也接触不到这种软件.ftp客户端软件主要是针对从事网站管理的工作人员比较有利的一款工具.可以帮助他们快速的解决工作中的问题.方便.简单.快捷又明了的解决问题 ...

  5. C++ 简单FTP客户端软件开发

    题目 简单FTP客户端软件开发(100分)网络环境中的一项基本应用就是将文件从一台计算机中复制到另一台可能相距很远的计算机中.而文件传送协议FTP是因特网上使用得最广泛的文件传送协议.FTP使用客户服 ...

  6. 手机上安装FTP客户端软件(AndFTP),实现通过手机访问计算机FTP服务器

    服务器连接工具: IIS7服务器管理工具是一款windows全系下用于连接并操控基于windows和linux系统的VPS.VNC.FTP等远程服务器.云服务器的管理工具. 界面简单明了,操作易上手, ...

  7. FTP客户端,Windows端有哪些FTP客户端软件值得推荐?

    iis7服务器管理软件 它是一款免费而且专业的ftp多站点管理软件,而且可以实现ftp定时备份的功能.除此之外,它还是一款强大的服务器集成管理器,可以批量管理windows及linux服务器及vps. ...

  8. ftp客户端软件有哪些,有哪些ftp客户端软件值得推荐?

    不知道大家对于ftp客户端软件的要求普遍是什么,但是我的要求是很简单的,主要就是好用,方便容易上手,使用起来很容易,不要太复杂的.其实我对于ftp软件的要求应该是大部分网站工作者的基本要求吧.下面是我 ...

  9. ftp下载工具,ftp上传下载工具使用指南,几款好用的ftp客户端软件推荐

    第一款:iis7服务器管理软件 它是一款免费而且专业的ftp多站点管理软件,而且可以实现ftp定时备份的功能.除此之外,它还是一款强大的服务器集成管理器,可以批量管理windows及linux服务器及 ...

最新文章

  1. 第一位女性商业程序员玛丽库姆斯去世,享年 93 岁!
  2. CentOS 6 使用 OpenLDAP 认证
  3. virtio驱动_0020 virtio-blk简易驱动
  4. 的训练过程_【能力模式】能力培养是一个训练过程,掌握三个要点,一个诀窍...
  5. 5.2k Star!一款 Python 实现的美观终端资源监视器
  6. python的0基础入门语法_学习小结(1)
  7. gcc g++ 支持c++11编译的标准和区别
  8. 智能会议系统(17)--- Linphone用户注册
  9. DDD中的Specification模式
  10. 利用CURL修改页面内容
  11. python menu_Python——Menu控件
  12. win10 android ios,一机多用?Win10可运行安卓和iOS应用
  13. 关于drawInRect: withAttributes: 等新方法的使用
  14. 炫彩LED电子时钟制作记录
  15. Gazebo手册:【2】如何建立建筑物模型
  16. 多分区装linux系统,Linux安装之多系统分区
  17. C# Winform 置顶属性Topmost 的误区
  18. 洛谷 P1093 [NOIP2007 普及组] 奖学金 AC100分
  19. Qt纯代码实现菜单栏、工具栏、状态栏
  20. 【404 App】2.0全新版本正式来袭之ALL模块。

热门文章

  1. Hive2.x、HiveServer、HiveServer2简述及Beeline使用
  2. Intel opencl sdk下载安装
  3. DownloadSDKServer.exe 是什么,DownloadSDKServer.exe 内存占用高怎么办
  4. Chrome 浏览器书签功能很强大
  5. 字符集、ASCII、Unicode
  6. 判断身份证:要么是15位,要么是18位,最后一位可以为字母,并写程序提出其中的年月日
  7. i3 10100F和R3 3200G哪个好
  8. HyperLynx(六)参数扫描仿真
  9. H263H264MPEG4
  10. cba篮球暂停次数和时间_篮球比赛一节有几次暂停?