Android手机FTP客户端开发

Home / Android MrLee 2015-10-29 4026

FTP简介

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。

实现

简单了解了FTP协议之后,开始代码实现。如果要自己完整实现FTP通讯,其实工作量还有点的,在这个高效率的时代,谁还没事全部自己手写呢?JAVA开源的框架多的去了,这里我们用到的FTP框架是ftp4j-1.7.2 ,里面已经封装好了我们要用的一些函数,如连接远程FTP服务器,登录,列出文件列表,下载文件……
看简单写的一个例子
package com.androiddemo;
import it.sauronsoftware.ftp4j.FTPAbortedException;
import it.sauronsoftware.ftp4j.FTPClient;
import it.sauronsoftware.ftp4j.FTPDataTransferException;
import it.sauronsoftware.ftp4j.FTPException;
import it.sauronsoftware.ftp4j.FTPFile;
import it.sauronsoftware.ftp4j.FTPIllegalReplyException;
import it.sauronsoftware.ftp4j.FTPListParseException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
	private FTPClient client;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		FileUtil.init(getApplication());
		setContentView(R.layout.activity_main);
		new Thread() {
			public void run() {
				initFtp();
			}
		}.start();
	}
	public void initFtp() {
		try {
			client = new FTPClient();
			// 连接我本地的服务器
			String[] cInfo = client.connect("113.57.128.59");
			for (String string : cInfo) {
				println(string);
			}
			client.login("plant", "plant");
			FTPFile[] files = client.list();
			for (FTPFile ftpFile : files) {
				String fileName = ftpFile.getName();
				if (fileName.equals(".") || fileName.equals(".."))
					continue;
				download(fileName);
			}
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FTPIllegalReplyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FTPException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FTPDataTransferException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FTPAbortedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FTPListParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	private void download(String fileName) throws IllegalStateException,
			FileNotFoundException, IOException, FTPIllegalReplyException,
			FTPException, FTPDataTransferException, FTPAbortedException {
		String writePath = FileUtil.getFileDir() + fileName;
		client.download(fileName, new File(writePath));
	}
	void disconnectFtp() {
		new Thread() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				super.run();
				close();
			}
		}.start();
	}
	void close() {
		try {
			if (client != null)
				client.disconnect(true);
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FTPIllegalReplyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FTPException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	void println(String text) {
		Log.i("FTP", text);
	}
	@Override
	public void finish() {
		// TODO Auto-generated method stub
		super.finish();
		disconnectFtp();
	}
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		System.exit(0);
	}
}

文件类
package com.androiddemo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import android.content.Context;
import android.os.Environment;
import android.os.StatFs;
/**
 * 图片远程下载、保存
 */
public class FileUtil {
	private static Context context;
	private static String storage = Environment.getExternalStorageState();
	private static String fileDir = FileUtil.class.getName() + "/";
	public static enum FileType {
		JPG, PNG, BMP, RAR, ZIP, SEVENZ, OTHER
	};
	public static Context getContext() {
		return context;
	}
	public static void init(Context context) {
		FileUtil.context = context;
		if (isMounted()) {
			fileDir = Environment.getExternalStorageDirectory()
					.getAbsolutePath() + File.separator + fileDir;
		} else {
			fileDir = context.getFilesDir().getAbsolutePath() + File.separator
					+ fileDir;
		}
		File file = new File(fileDir);
		if (!file.exists())
			file.mkdir();
	}
	/**
	 * @param fileName
	 * @return
	 */
	public static File readFile(String fileName) {
		if (fileName == null)
			return null;
		StringBuffer buffer = new StringBuffer(fileDir);
		buffer.append(File.separatorChar);
		buffer.append(fileName);
		File file = new File(buffer.toString());
		if (file.exists())
			return file;
		return null;
	}
	public static String getFileType(String fileName) {
		int pos = fileName.lastIndexOf(".");
		if (pos != -1 && pos < fileName.length()) {
			String dot = fileName.substring(pos + 1);
			return dot;
		}
		return "png";
	}
	/**
	 * 向SD卡写文件
	 * 
	 * @param path
	 * @param data
	 * @isRecovery 是否覆盖
	 * @return
	 */
	public static boolean writeFile(String path, byte[] data, boolean isRecovery) {
		try {
			File file = new File(path);
			if (file.exists() && !isRecovery)
				return true;
			file.createNewFile();
			FileOutputStream fos = new FileOutputStream(file);
			fos.write(data);
			fos.flush();
			fos.close();
			return true;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}
	/**
	 * 是否挂载SD卡
	 * 
	 * @return
	 */
	public static boolean isMounted() {
		return storage.equals(Environment.MEDIA_MOUNTED);
	}
	// 获取本机容量信息
	public long phoneCapacity() {
		// 获取本机信息
		File data = context.getFilesDir();
		StatFs statFs = new StatFs(data.getPath());
		long availableBlocks = statFs.getAvailableBlocks();// 可用存储块的数量
		long size = statFs.getBlockSize();// 每块存储块的大小
		long availableSize = availableBlocks * size;// 可用容量
		return availableSize;
	}
	// 获取sdcard容量信息
	public long sdcardCapacity() {
		// 获取sdcard信息
		File sdData = Environment.getExternalStorageDirectory();
		StatFs sdStatFs = new StatFs(sdData.getPath());
		long sdAvailableBlocks = sdStatFs.getAvailableBlocks();// 可用存储块的数量
		long sdSize = sdStatFs.getBlockSize();// 每块存储块的大小
		long sdAvailableSize = sdAvailableBlocks * sdSize;
		return sdAvailableSize;
	}
	public static String getFileDir() {
		return fileDir;
	}
}

执行结果如下图:

20151029153400


然后会在SD卡中创建一个目录,目录下面就有FTP目录对应的文件了。

本文链接:https://www.it72.com/6638.htm

推荐阅读
最新回复 (0)
返回