`
phenom
  • 浏览: 408881 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

android ftp 客户端编写(ftp4j)

 
阅读更多
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就是个不错的东西,然后拍照或录像再上传。其它就不说了,直接传代码上来。完成的程序可以使用,只是有些简陋,仅供参考。目前的需求就是拍照来录像后上传到ftp。

分享到:
评论
10 楼 野牛精 2015-09-17  
感谢楼主分享,帮大忙了。
9 楼 zhunanfengfeimeng 2015-07-22  
http://www.iteye.comhttp://www.iteye.com/images/smiles/icon_wink.gif  /images/smiles/icon_wink.gif
8 楼 phenom 2014-08-11  
zmttpassion 写道
无比郁闷!不会用这个开发工具


apache也有ftp客户端,该客户端已经有些时日,由于平常没有用到ftp,所以不维护了.
如果工具不会用,可以参考 jetbrains.com的视频(idea以前是收费的,文档,示例都相当完善),或者使用eclipse,
7 楼 zmttpassion 2014-08-11  
无比郁闷!不会用这个开发工具
6 楼 xzongyuan 2013-03-21  
代码有参考价值
5 楼 xzongyuan 2013-03-21  
学到很多,谢谢
4 楼 phenom 2013-03-11  
engineer_hu 写道
下载下来以后,放在android开发环境中,还没有运行,报一堆错误。


关于工程的错误,不解释,本人所有工程只是idea工程,如果是eclipse,请自行处理.
3 楼 engineer_hu 2013-03-11  
下载下来以后,放在android开发环境中,还没有运行,报一堆错误。
2 楼 WindProtect 2013-01-17  
谢谢博主~很详细的说!
1 楼 Rockey723 2012-09-11  
相当详细啊,顶,对我这新菜很有用。还请楼主多照应、、、

相关推荐

    ftp客户端(ftp4j修改版)

    FTP客户端是用于与远程服务器进行文件传输的一种工具,而`ftp4j`是一个用Java编写的开源FTP客户端库。这个“ftp4j修改版”针对的是原始ftp4j库在Android平台上的一个特定问题,即在Android终端上释放FTP连接时出现...

    基于qt写的ftp客户端小软件

    4. **目录操作**:FTP客户端需能浏览远程服务器的目录结构,支持上下级目录切换。这需要解析服务器返回的目录列表,通常以ASCII格式,如UNIX风格的ls命令输出。Qt的QString和QTextStream类可以辅助处理文本流。 5. ...

    FTPClient_ftp4j

    FTPClient_ftp4j是一个专为Android平台设计的FTP客户端库,它允许开发者在Android应用中实现FTP(文件传输协议)功能。FTP是Internet上的一种标准协议,用于在客户端和服务器之间上传、下载文件。FTPClient_ftp4j库...

    android ftp所需的各种包

    在Android项目中,需要处理兼容性问题,因为FTP4j不直接支持Android。但开发者可以通过将FTP4j打包成aar或者使用Gradle子项目的方式引入。 5. **使用OkHttp或Retrofit实现FTP**: 尽管OkHttp和Retrofit主要是为...

    Android FTp文件下载demo

    这些库提供了API,方便开发者编写FTP客户端代码。 4. **建立FTP连接**:首先,创建FTPClient实例,并设置服务器地址、端口、用户名和密码,然后调用`connect()`方法建立连接。 5. **登录验证**:使用`login()`方法...

    Android客户端与服务器通信+json交互数据

    在Android应用开发中,客户端与服务器的通信是至关重要的,特别是在构建移动应用时,需要实时地获取或提交数据。在这个场景中,Android客户端通常通过HTTP协议与服务器进行交互,而JSON(JavaScript Object Notation...

    Android ftp断点续传Demo

    本项目“Android ftp断点续传Demo”旨在演示如何在Android应用中实现FTP客户端功能,支持断点续传,即在中断后能够从上次停止的地方继续传输文件,这对于大文件的传输尤其有用。以下将详细介绍该Demo涉及的关键知识...

    android ftp server code

    SwiFTP是一个用Java编写的轻量级FTP服务器,特别适合在Android设备上运行。 FTP(File Transfer Protocol)是一种标准网络协议,用于在Internet上进行文件传输。在Android上实现FTP服务器,开发者需要考虑以下几个...

    Swiftp Android Ftp

    《SwiftP Android FTP:构建移动设备上的FTP服务器》 SwiftP Android FTP 是一款专为Android平台设计的FTP服务器源代码,它允许用户在Android设备上搭建FTP服务,从而实现从远程计算机上传或下载文件。这一技术的...

    android kotin+ ftp视频上传+android7.0 语音识别+百度地图+ 图片和拍照

    在Android应用中,开发者可以使用第三方库如Apache Commons Net或者OkHttp来实现FTP客户端功能,将录制或选择的视频文件上传到远程服务器。这需要理解FTP的工作原理、连接建立、文件传输等步骤,同时需要处理网络...

    java FTP server

    开发者可以利用Java的`java.net.Socket`类来创建网络连接,`java.nio`包中的类处理文件读写,以及通过多线程处理并发的FTP客户端请求。FTP服务器的主要功能包括: 1. **用户认证**:Java FTP Server需要具备用户...

    Android ftp文件分割上传,并且实现合并

    然后,在Android应用中创建一个FTP客户端,设置连接参数(如服务器地址、端口号、用户名和密码),并建立连接。连接成功后,可以使用FTPClient的`changeWorkingDirectory()`方法切换到目标目录,准备上传文件。 ...

    ftp.zip_QT FTP_ftp

    在这个"ftp.zip_QT FTP_ftp"的项目中,我们看到一个使用QT库编写的FTP客户端程序。QT是一个跨平台的C++开发框架,适用于创建图形用户界面和其他软件应用。下面将详细介绍FTP协议、QT库以及如何使用QT来实现FTP客户端...

    FTPAndroid开发

    FTP客户端与服务器** FTP系统由客户端和服务器组成。客户端是用户交互的界面,负责发送命令和接收文件;服务器则响应客户端的请求,管理文件并执行传输操作。 **3. Android中的FTP库** 在Android开发中,常见的FTP...

    android_DFTPClient_Project:开源 FTP 客户端。 作为 Udacity Android 应用程序开发课程的项目制作

    【标题】"android_DFTPClient_Project" 是一个开源的 Android 应用程序,它实现了一个 FTP(文件传输协议)客户端。这个项目是针对 Udacity 的 Android 应用开发课程的学生设计的,旨在帮助他们学习和实践 Android ...

    linux c 语言编写的ftp服务器程序

    在Linux系统中,使用C语言编写FTP服务器程序能够深入理解网络编程的底层原理,同时也具备高度的灵活性和可定制性。下面将详细介绍这个基于C语言实现的FTP服务器程序及其与Qt界面的集成。 首先,FTP服务器程序的核心...

    基于FTP服务器的Android设备与Matlab的信息交互.zip

    在Android设备端,开发者通常需要编写一个应用程序,利用Android的FTP客户端库或者集成到应用中的FTP功能,来连接到FTP服务器。这个过程涉及配置服务器的地址、端口号、用户名和密码,以及建立安全连接(如使用SSL/...

    基于java的swiftp(Android上的FTP服务器 SwiFTP).zip

    6. **FTP服务器实现**:SwiFTP的实现可能基于标准的FTP协议库,如Apache Commons Net库,该库提供了FTP客户端和服务器端的实现,便于开发者快速构建FTP功能。 7. **用户界面(UI)**:虽然SwiFTP主要是后台服务,但...

    基于Java的swiftp(Android上的FTP服务器 SwiFTP).zip

    - 在另一台设备上使用FTP客户端软件,输入Android设备的IP地址、端口号、用户名和密码,即可建立连接并进行文件操作。 5. 安全考虑 虽然SwiFTP提供了一种方便的文件共享方式,但也需要注意安全问题。使用默认的匿名...

Global site tag (gtag.js) - Google Analytics