最近项目完工,闲暇之余抽出来时间给大家分享项目中用到的关于FTP和服务端交互的列子。本项目是基于串口编程,通过给串口发送指令给电子锁(文章后边简称e-lock)发送指令从而启动e-lock的wifi模块,然后手持机去连接wifi展开通信。
[这里是代码目录结构]
DelThread.java
FTPConstant.java
FTPHelper.java
RS232Activity.java
1. FTP远程建立连接
public static final String userName = "root";
public static final String password = "root";
public static final String url = "192.168.1.251";
public static final int port = 21;
public static final String fileName = AppUtil.createName(System.currentTimeMillis());
public static final String localPath = FileUtil.getNuctechPath();// 本地路径;
public static final String remotePath = "/mnt/660010F011"; //FTP远程文件夹目录
public static final int DELETE_ITEM = 001; //FTP通信`
FTPClient ftp = FTPHelper.getConnectionFTP(FTPConstant.url,
FTPConstant.port, FTPConstant.userName,
FTPConstant.password);
ftp.changeWorkingDirectory(FTPConstant.remotePath);// 转移到FTP服务器目录
2. 那么上一部建立连接拿到FtpClient的实例化对象之后 我们就要获取远程文件列表和本地缓存的文件列表
这里我们把文件加到list集合中便于比较
// 先从本地去取文件
picPath = FileUtil.getNuctechPath();// 本地路径
List fileDirList = FileUtil.getFileDirList(picPath);`
List ftpList = new ArrayList();
FTPFile[] listFiles = ftp.listFiles();
for (FTPFile ftpFile : listFiles) {
ImageItem item = new ImageItem();
item.setFileName(ftpFile.getName());
item.setImagePath(picPath);
ftpList.add(item);
}
3. 对比本地和远程的文件数量,也就是比大小,进而选择是去删除还是增加,要选取参照物。
if (ftpList.size() > fileDirList.size()) {
downDifFromFtp(ftpList, fileDirList);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
ActionToshowPicPage(FileUtil
.getFileDirList(picPath));
}
}, 300);
} else if (ftpList.size() < fileDirList.size()) {
delectLocalDiffFtp(fileDirList, ftpList);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
ActionToshowPicPage(FileUtil
.getFileDirList(picPath));
}
}, 300);
} else {
ActionToshowPicPage(fileDirList);
}
} catch (IOException e) {
e.printStackTrace();
}
好那么从以上代码片段大概意思也就能明白什么意思了
如果远程文件个数大于本地缓存的,我们就要从远程下载本地所没有的;
如果远程文件夹个数小于本地缓存的, 我们就要从本地进行删除多余的;
反之我们就直接显示ftp文件列表
这一部分我相信只要入门安卓工作一年应该就能看明白的
那么下边附上代码核心部分
1. 下载
/**
2. 通过比对ftp远程文件和本地不同,进行下载
3.
4. @param ftpList
5. @param fileDirList
6.
*/
private void downDifFromFtp(final List<ImageItem> ftpList, final List<ImageItem> fileDirList) {
List<String> uncontainList = FTPHelper.getUncontain(
(ArrayList<ImageItem>) ftpList, fileDirList);
for (String imageItem : uncontainList) {
if (AppUtil.isNetworkAvaiable(mContext)) {
picPath = FileUtil.getNuctechPath();// 本地路径
ftpDownload(FTPConstant.url, FTPConstant.port,
FTPConstant.userName, FTPConstant.password,
FTPConstant.remotePath,picPath, imageItem);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
showMsg(getString(R.string.net_error));
}
}
7. 删除
/**
* 通过比对local和ftp,如果本地有多余的立马删除
*
* @param fileDirList
* @param ftpList
*/
private void delectLocalDiffFtp(List<ImageItem> ftpList, List<ImageItem> fileDirList) {
List<String> uncontainList = FTPHelper.getUncontain2(
(ArrayList<ImageItem>) ftpList, fileDirList);
for (String imageItem : uncontainList) {
DataCleanManager.deleteFile(picPath, imageItem);
}
// 最后通知图库更新
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + picPath)));
}
}
8. 好了 最后一个跳转页面
/**
* 跳转到列表页面
*
* @param fileDirList
*/
protected void ActionToshowPicPage(List<ImageItem>fileDirLis