技术标签: Android ftp服务器搭建 ftpclient Android入门学习 ftpserver
最近一段时间,因为公司项目的需要,对HTTP协议以及FTP协议都有所了解,并且在基于网络开放源代码
基础上,能够完成项目的要求。今天给大家分享下,怎样建立属于我们自己的FTP服务器以及FPT客户端,同时
非常非常感谢这些开源软件及其作者为IT行业做出的贡献,最大程度上至少解放了我们这些IT码农。且看正文。
本文主要内容:
1、FTP服务端部署---- 基于Android中SwiFTP开源软件介绍;
2、FTP客户端部署 --- 基于ftp4j开源jar包的客户端开发 ;
3、使用步骤 --- 如何测试我们搭建的FTP可操作性。
本文所涉及到的知识、文档、源代码照旧会在文章末尾列出。欢迎大家一起学习。
SwiFTP开源软件是为Android系统开发,也就是说我们可以将其源代码嵌入到我们的项目中。当然,对其进行
一定改造还是必不可少的。这儿只是从感官上对SwiFTP的运行效果图进行一下说面,以便帮助大家有初步认识:
SwiFTP 资料信息:
Google Download 介绍 : http://code.google.com/p/swiftp/downloads/list
GitHub 介绍 : https://github.com/ppareit/swiftp
Android版本SwiFTP截图
界面其实很简单,但是从设计角度分析,SwiFTP框架系统还是值得我们研究的,当然如果你想改造成
属于自己的FTP服务器(一般就是改改用户名、密码、PWD(起始工作目录))等,那更得花时间去钻研了。
接下来,重点介绍我们的主角ftp4j开源jar包,该jar包就是开发我们FTP客户端核心了。
ftp4j官网地址:http://www.sauronsoftware.it/projects/ftp4j/。对比与AndroidSDK而言,也就是ftp4j
SDK了,一切的一切(文档、源代码、示例)都可以在官网查询 。想要了解的同学,至少得保证把首页给整明白吧。
官网描述如下:
The ftp4j libraryimplementsa Java full-features FTP client. With ftp4j embedded in your
application you can : FTP site (directory listing included), create, delete, transfer files
(upload and download) , browse the remote FTP site (directory listing included), create, delete,
rename and move remote directories and files.
关于FTP连接主要有如下几种方式:
The ftp4j library can connect the remote FTP server:
· Througha direct TCP/IPconnection. 一般就是直接连接了。
· Througha FTP proxy. FTP代理
· Tunnelling through a HTTPproxy. HTTP代理
· Througha SOCKS 4/4aproxy.
· Througha SOCKS 5 proxy.
· You can add support to otherproxies plugging your own connector, since the ftp4jconnection manager
architecture is modular.
下面根据官网的描述,将该ftp4j库的主要类简单说明下:
该类封装了对FTPCommand的请求操作。例如:连接FTP服务器、进行各种各样的FTP操作(上传、下载、
删除、重命名文件 等)。基本使用流程图如下:
利用伪代码描述如下:
主要方法:
public java.lang.String [] connect(java.lang.String host, int port) throws java.lang.IllegalStateException,
java.io.IOException , FTPIllegalReplyException , FTPException
功能:与FTP服务器主机建立连接 .
参数 :
host - FTP服务器的主机名(host name) 或者 ip地址
port - FTP服务器的监听端口
返回值 : The server welcome message ,FTP服务器响应消息
抛出异常类型 : (略,参见后文)
public void login(java.lang.String username , java.lang.String password)
throws java.lang.IllegalStateException,
java.io.IOException, FTPIllegalReplyException, FTPException
功能:根据用户名以及密码登录FTP服务器
参数:
username – 登录FTP服务器的用户名.
password - 登录FTP服务器的 密码
返回值:(无)
抛出异常类型 : (略,参见后文)
public java.lang.String currentDirectory() throws java.lang.IllegalStateException, java.io.IOException,
FTPIllegalReplyException, FTPException
功能 :获取FTP服务器当前工作目录。
返回值:FTP服务器当前工作目录
抛出异常类型 : (略,参见后文)
public long fileSize(java.lang.String path)
功能:获取指定文件的大小。
参数:
path -- 指定文件所在的路径,可以是相对路径或者是绝对路径。
返回值 : 指定文件的大小,单位为byte.
抛出异常类型 : (略,参见后文)
public void deleteFile(java.lang.String path) throws java.lang.IllegalStateException, java.io.IOException,
FTPIllegalReplyException, FTPException
功能:删除指定文件
参数:
path -- 指定文件所在的路径,可以使相对路径或者是绝对路径。
返回值:(无)
抛出异常类型 : (略,参见后文)
public void deleteDirectory(java.lang.String path) throws java.lang.IllegalStateException,
java.io.IOException, FTPIllegalReplyException, FTPException
功能: 删除指定文件夹
参数:
path -- 指定文件所在的路径,可以使相对路径或者是绝对路径。
返回值:(无)
抛出异常类型 : (略,参见后文)
public FTPFile[] list() throws java.lang.IllegalStateException , java.io.IOException,
功能: 获取当前工作目录所有文件信息:文件名、文件大小、文件类型(文件或者文件夹)。
返回值: FTPFile[]数组对象 ---- 该文件夹所对应的信息
抛出异常类型 : (略,参见后文)
public java.lang.String[] listNames()
功能: 获取当前工作目录的所有文件名。
返回值:String[]类型 ----- 所有文件名
抛出异常类型 : (略,参见后文)
public void upload(java.io.File file , FTPDataTransferListener listener) throws java.lang.IllegalStateException,
java.io.FileNotFoundException, java.io.IOException, FTPIllegalReplyException, FTPException,
FTPDataTransferException, FTPAbortedException
功能 :上传文件至FTP服务器。该操作会阻塞当前线程,阻塞会在操作完成后解除。该方法可以通过调用
abortCurrentDataTransfer()方法去中断。默认上传的文件目录是当前工作目录,通过currentDirectory()方法
可以获得。注意:不支持上传文件夹。
参数:file -- 上传文件的File对象
listener -- 监听器 (稍后介绍)
抛出异常类型 : (略,参见后文)
public void download(java.lang.String remoteFileName, java.io.File localFile,
FTPDataTransferListener listener)
throws java.lang.IllegalStateException, java.io.FileNotFoundException,
java.io.IOException, FTPIllegalReplyException, FTPException,
FTPDataTransferException, FTPAbortedException
功能:下载某个文件值指定路径。该操作会阻塞当前线程,阻塞会在操作完成后解除。该方法可以通过调用
abortCurrentDataTransfer()方法去中断。注意:不支持下载文件夹。
参数:
remoteFileName - 相对路径(相对于当前目录)时则是文件名或者绝对路径(例如:Linux中以”\”为前缀)
localFile - 本地存放文件的File对象。
listener - 监听器 (稍后介绍)
抛出异常类型 : (略,参见后文)
public void abortCurrentDataTransfer(boolean sendAborCommand) throws java.io.IOException,
FTPIllegalReplyException
功能:如果存在任何正在进行的文件操作(上传/下载),该方法会中断它
参数
sendAborCommand -- true则代表中断文件操作,并且发送ABORT 命令给FTP服务器
false 代表关闭中断文件操作,将不会发送任何消息给FTP服务器。
抛出异常类型 : (略,参见后文)
该类封装了FTP服务器中文件的信息,即Model类。
常量字段:
文件对应类型
public static final intTYPE_FILE 文件
public static final intTYPE_DIRECTORY 文件夹
public static final intTYPE_LINK 文件引用
主要方法:
public java.util.Date getModifiedDate() 获取文件最后修改日期。
public int getType() 获取文件类型。
public long getSize() 获取文件大小 ,单位为byte。
该接口约定了文件传输过程中的回调方法类型。我们可以实现该类去监听每个具体的文件操作过程。
回调接口有:
void started() 回调方法,表示已开始文件传输。
void completed() 回调方法,表示文件传输已完成。
void aborted() 回调方法,表示文件传输已被中断,可由abortCurrentDataTransfer()触发。
void failed() 回调方法,表示文件传输由于某种错误而失败。
void transferred(int length) 回调方法,表示本次回调过程中已下载/上传的文件字节大小。
参数: length --本次回调过程中下载/上传的文件字节大小。
PS :我们可以累积length大小,以便获得当前文件已传输的字节数。
异常种类:
ftp4j的自定义共有如下几种,基本上每个FTP操作,都伴随着这些异常,因此,我们需要捕获这些异常信息。
当文件传输过程被显示中断(例如,调用abortCurrentDataTransfer()方法)时,抛出该异常。
在文件传输过程中,发生任何I/O(例如,无法创建文件流)错误,都会抛出该异常。
封装了FTP错误码以及错误消息的异常类。PS:类似于HTTP错误码以及错误消息
常用方法:
public int getCode() 获取异常发生时,FTP的错误码(错误码字段值具体可见FTPCodes类)
public java.lang.String getMessage() 获取异常发生时,FTP的错误消息。
当FTP服务器以一种非正常的方式---违反了FTP协议的规则响应时,抛出该异常。
通过list()方法请求FTP服务时,如果此时FTP服务器的返回的消息不能被正确的解析时,都会抛出该异常。
通过对这些相关知识的学习,足矣利用ftp4j jar包完成我们简易却又充实的专属我们自己的FTP客户端了。
接下来,便开始我们的FTP客户端的开发。
在功能需求上,开发一个FTP客户端和开发一个文件选择器甚至文件管理器基本上没有任何区别,唯一的区别
只在于数据来源不同,这个不同会导致功能实践上更多细节的差异,例如:异常的捕获、断点尝试等。代码方面
我就不再赘述了,对前面所介绍类的掌握和理解,应该No Problem了。主要说一下两点:
①、由于Android4.0不允许在主线程上进行网络操作,例如:Socket编程,我们的操作必须放在新的线程中。
同时为了减少创建线程的开销,我们试用了线程池去执行每一个FTP操作。
②、试用FTPClient时,不允许上传/下载文件夹,我也没有针对这一方面进行更多的开发(具体实现过程大致
为:对文件夹里的每个文件皆进行上传/下载操作),有兴趣的同学可以看看这篇帖子<基于ftp4j的FTP客户端工具>,
会提升对你对ftp4j的使用认知的。
我们的FTP客户端主要功能为:
①、显示特定目录列表;
②、删除文件以及文件夹,下载文件;
③、上传文件。
主要代码如下:
前提条件, 确保两台手机分别安装FTP服务端,FTP客户端 ,并且能连接上WIFI网络。
第一步:运行FTP服务器SwiFtp,输入基本信息(端口、用户名、密码),同时确保FTP服务器成功开启 。如图:
配置FTP服务器信息 FTP服务器状态
第二步:运行FTP客户端,填写FTP验证时的资料(即第一步输入信息)后,连接FTP服务器即可。如图:
最后,本文所涉及到的所有资料以及文章中示例的源代码的下载地址为:
http://download.csdn.net/detail/qinjuning/5034873
文章浏览阅读3k次。今天刚刚写ssh2的框架在分页的时候遇到一个问题,百度了好多的分页,发现大多数都是说通过bean来保存,然后在获取出来。然而用这个bean来操作分页的时候还必需的在添加到层继承一个HibernateDaoSupport,我是初学ssh2框架的,不喜欢的可以让道,勿喷哦。继承HibernateDaoSupport这个接口以后就不能再用你原来的方法来获取session下面的这个是我在没有继承H_hibernatedaosupport getsessionfactory
文章浏览阅读1.6k次。下载:Anderson Studio是Google为Android提供的官方IDE工具,下载地址:http://www.android-studio.org/此处下载3.4.1版本。安装环境要求 :其中JDK的最低版本是1.7,所以系统空闲内存至少2GB。如果你要安装andriod8.0左右的版本,最好内存能有8GB。Android Studio安装过程:以android-studio-ide-183.5522156-windows(2019.9.10最新的版本3.4.1)._tools android-studio org
文章浏览阅读2.1k次。说明 将一组数字、字母或符号进行排列,以得到不同的组合顺序,例如1 2 3这三个数的排列组合有:1 2 3、1 3 2、2 1 3、2 3 1、3 1 2、3 2 1。 C代码#include#include#define N 4void prem(int *, int);int main(){ int num[N + 1];; for_c32排列组合
文章浏览阅读249次。The 13th Chinese Northeast Collegiate Programming ContestB. Balanced Diet#include<bits/stdc++.h>#define il inline#define pb push_back#define fi first#define se second#define ms(_..._2019东北四省ccpc题解f
文章浏览阅读1.3k次。来源:华为2020年9月24日,在HUAWEI CONNECT 2020期间,华为全面阐述全场景智能联接解决方案,从技术、网络、行业三个层面打造泛在千兆、确定性体验和超自动化的智能联接,..._华为 自动驾驶
文章浏览阅读1.4k次。报错:libpng warning: Application was compiled with png.h from libpng-1.6.17libpng warning: Application is running with png.c from libpng-1.2.53libpng error: Incompatible libpng version in applic_libpng error: incompatible libpng version in application and library
文章浏览阅读2.1k次。有序整数集是Redis源码中一个以大尾(big endian)形式存储,由小到大排列且无重复的整型集合。它存储的类型包括16位、32位和64位的整型数。在介绍这个库的实现前,我们还需要先熟悉下大小尾内存存储机制。(转载请指明出于breaksoftware的csdn博客)大小尾(Big Endian/Little Endian) 第一次接触这个概念还是在大学时上..._intrev32
文章浏览阅读951次。ssh-add@(ssh)ssh-add命令是把专用密钥添加到ssh-agent的高速缓存中。该命令位置在/usr/bin/ssh-add。-D:删除ssh-agent中的所有密钥.-d:从ssh-agent中的删除密钥-e pkcs11:删除PKCS#11共享库pkcs1提供的钥匙。-s pkcs11:添加PKCS#11共享库pkcs1提供的钥匙。-L:显示ssh-age..._(ssh-agent -p '')
文章浏览阅读1.1k次。日萌社人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)基于矩阵分解的CF算法实现(一):LFMLFM也就是前面提到的Funk SVD矩阵分解LFM原理解析LFM(latent factor model)隐语义模型核心思想是通过隐含特征联系用户和物品,如下图:P矩阵是User-LF矩阵,即用户和隐含特征矩阵。LF有三个,表示共总有三个隐含特征。 Q矩阵是LF-Item矩阵,即隐含特征和物品的矩阵._lfm funksvd
文章浏览阅读4k次。摘要:校园网带ipv6协议,可以用来登六维,玩PT。传统路由器只能实现ipv4的路由功能,不能实现ipv6路由功能。我这边的校园网是ipv4需要登陆账号,ipv6原生免费。传统方法需要使用桥接模式,但是每连一台设备都需要登陆一个ipv4账号。那么如何实现路由器只能一个账号,既能使用ipv6又能使用ipv4成为一个可以研究的问题。设备:极路由 斐讯K2 Newifi等等,要求刷华硕固件..._斐讯k2 ipv6
文章浏览阅读6.3k次,点赞7次,收藏47次。一、前言之前有篇博文刨根问底VS浅尝而止,本着了解知识由浅入深,先宏观再深究,先应用再具体的原则来总结UDS的内容。UDS(Unified Diagnostic Services,统一的诊断服务)诊断协议是在汽车电子ECU环境下的一种诊断通信协议。二、参考:UDS入门:https://blog.csdn.net/cheatscat/article/details/109493618..._uds
文章浏览阅读2w次,点赞9次,收藏87次。Spark SQL简介一、从Shark说起1、在这之前我们要先理解Hive的工作原理:Hive是一个基于Hadoop的数据仓库工具,提供了类似于关系数据库SQL的查询语言——HiveSQL,用户可以通过HiveSQL语句快速实现简单的MapReduce统计,Hive自身可以自动将HiveSQL语句快速转换成MapReduce任务进行运行。2、Shark提供了类似于Hive的功能,与Hive不同的是,Shark把SQL语句转换成Spark作业,而不是MapReduce作业。可以近似地认为:Shar_spark sql