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我就不说了,自己对照着新建就行了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171 |
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); + ":"
+ 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的客户端里面的 被动模式 为 主动模式这样才可以连接上啊,这是血的教训,老子调试了一整天才搞定,头都搞大了。你要是问我怎样修改服务端让他客户端链接的时候直接成为被动模式,不好意思,我也不知道,这个不知道三个字的得来也废了老子一整天时间。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。