經過了幾天的研究,終於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的客戶端里面的 被動模式 為 主動模式這樣才可以連接上啊,這是血的教訓,老子調試了一整天才搞定,頭都搞大了。你要是問我怎樣修改服務端讓他客戶端鏈接的時候直接成為被動模式,不好意思,我也不知道,這個不知道三個字的得來也廢了老子一整天時間。