android学习:Android上面部署Apache FTPServer
经过了几天的研究,终于Apache FTPServer在Android的配置和使用上有了一些心得,现在分享出来,提供给大家参考,说到这儿又不得不吐槽一下这要命的转载了,找Apache FTPServer方面的资料网上千篇一律的都是同一个人的博客,而且这个博客的很多东西还是说的比较模糊的,初次使用的人根本看不懂啊,搞毛啊,逼这我不得不再次写一篇东西出来。
还是按照步骤来叙述吧。
1.从Apache官网上下载Apache FTPServer的Released版本,地址为 http://mina.apache.org/ftpserver-project/downloads.html
2.下载完之后可以看到是一个文件夹apache-ftpserver-1.0.6。然后新建一个Android的项目,本人新建的项目是Android 2.2的项目。
3.拷贝apache-ftpserver-1.0.6/common/lib 目录下的 ftpserver-core-1.0.6.jar、log4j-1.2.14.jar、mina-core-2.0.4.jar、slf4j-api-1.5.2.jar、slf4j-log4j12-1.5.2.jar 这些文件到你新建的Android项目目录下的libs目录下,其他不用拷贝。
4.在你的Android项目中res文件夹下新建raw目录,然后拷贝/Users/lixing/Downloads/apache-ftpserver-1.0.6/res/conf/users.properties 文件到raw目录下面去。
5.打开你的Android项目中的 users.properties文件,把内容修改为如下内容,下面解释下这个内容的含义:
# Password is "admin"
ftpserver.user.admin.userpassword=21232F297A57A5A743894A0E4A801FC3
ftpserver.user.admin.homedirectory=/sdcard/
ftpserver.user.admin.enableflag=true
ftpserver.user.admin.writepermission=true
ftpserver.user.admin.maxloginnumber=20
ftpserver.user.admin.maxloginperip=5
ftpserver.user.admin.idletime=300
ftpserver.user.admin.uploadrate=4800000
ftpserver.user.admin.downloadrate=4800000
ftpserver.user.zhangsan.userpassword=21232F297A57A5A743894A0E4A801FC3
ftpserver.user.zhangsan.homedirectory=/sdcard/
ftpserver.user.zhangsan.enableflag=true
ftpserver.user.zhangsan.writepermission=true
ftpserver.user.zhangsan.maxloginnumber=20
ftpserver.user.zhangsan.maxloginperip=5
ftpserver.user.zhangsan.idletime=300
ftpserver.user.zhangsan.uploadrate=4800000
ftpserver.user.zhangsan.downloadrate=4800000
解释一下,上面这些内容实际上是Apache FTPServer的用户配置文件,主要是用来配置FTP的登录用户信息,我们可以看到这个配置文件里面描述了两个用户,一个用户名是admin,另外一个用户是zhangsan,没错,你没有看错,就是这样的,如果你要添加新的用户,可以使用这个格式 如 ftpserver.user.用户名.XXXX
对于单个用户,这里一行一行的解释
第一行:设置用户的登录密码 ,这个密码是MD5加密的,所以看起来有点儿奇怪,目前示例中的这个密码是admin的MD5加密值
第二行:设置FTP用户的根目录,因为我们是手机,所以我现在将这个目录设置为我的手机的Sd卡的根目录
第三行:设置这个登录账户是否被启用
第四行:设置这个账户是否具有可写的权限。
第五行:这个用户的同一时间最大的的登录用户数量,这里设置大一点,没什么问题,设置小了会出现总是登录不成功的情况
第六行:设置最大的登录IP数量,这里也设置大一点,原因同上
第七行:超时时间
第八行:上传速度,这里设置的比较大,最少字面上的意思是这样的,但是我不得不说你需要设置的大一些,否则你会发现你根本无法上传大文件,可能是一个bug吧,要注意
第九行:下载速度,这里设置的比较大,原因同上
6.新建一个java类,然后把下面代码粘贴进去,具体需要新建的layout我就不说了,自己对照着新建就行了
package xing.li; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; import org.apache.ftpserver.FtpServer; import org.apache.ftpserver.FtpServerFactory; import org.apache.ftpserver.ftplet.FtpException; import org.apache.ftpserver.listener.ListenerFactory; import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private FtpServer mFtpServer; private int port =2222;// 端口号 private String ftpConfigDir = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/ftpConfig/"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = (TextView) findViewById(R.id.tvText); String info = "请通过浏览器或者我的电脑访问以下地址\n" + "ftp://" + getLocalIpAddress() + ":" + port + "\n"; tv.setText(info); Button btnStart = (Button) findViewById(R.id.btnStart); btnStart.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { File f = new File(ftpConfigDir); if (!f.exists()) f.mkdir(); copyResourceFile(R.raw.users, ftpConfigDir + "users.properties"); Config1(); } }); Button btnStop = (Button) findViewById(R.id.btnStop); btnStop.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { mFtpServer.stop(); } }); File f = new File(ftpConfigDir); if (!f.exists()) f.mkdir(); copyResourceFile(R.raw.users, ftpConfigDir + "users.properties"); copyResourceFile(R.raw.users, ftpConfigDir + "ftpserver.jks"); Config1(); } public String getLocalIpAddress() { String strIP = null; try { for (Enumeration<NetworkInterface> en = NetworkInterface .getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> enumIpAddr = intf .getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()) { strIP = inetAddress.getHostAddress().toString(); } } } } catch (SocketException ex) { Log.e("msg", ex.toString()); } return strIP; } private void copyResourceFile(int rid, String targetFile) { InputStream fin = ((Context) this).getResources().openRawResource(rid); FileOutputStream fos = null; int length; try { fos = new FileOutputStream(targetFile); byte[] buffer = new byte[1024]; while ((length = fin.read(buffer)) != -1) { fos.write(buffer, 0, length); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fin != null) { try { fin.close(); } catch (IOException e) { e.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } void Config1() { FtpServerFactory serverFactory = new FtpServerFactory(); ListenerFactory factory = new ListenerFactory(); PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory(); String[] str = { "mkdir", ftpConfigDir }; try { Process ps = Runtime.getRuntime().exec(str); try { ps.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } String filename = ftpConfigDir + "users.properties"; File files = new File(filename); userManagerFactory.setFile(files); serverFactory.setUserManager(userManagerFactory.createUserManager()); factory.setPort(port); try { serverFactory.addListener("default",factory.createListener()); FtpServer server = serverFactory.createServer(); this.mFtpServer = server; server.start(); } catch (FtpException e) { e.printStackTrace(); } } @Override protected void onDestroy() { super.onDestroy(); if (null != mFtpServer) { mFtpServer.stop(); mFtpServer = null; } } }
7,一切搞掂了就可以运行一下了,运行完毕了之后,就在同一个网络中的ftp客户端中试着链接一下,注意要修改一下ftp的客户端里面的 被动模式 为 主动模式这样才可以连接上啊,这是血的教训,老子调试了一整天才搞定,头都搞大了。你要是问我怎样修改服务端让他客户端链接的时候直接成为被动模式,不好意思,我也不知道,这个不知道三个字的得来也废了老子一整天时间。