swiftp是一个开源的ftp server,源码可以从下面地址拉。

自己的需求是将ftp server移植到自己的app中,使用USB数据线管理手机上的文件。其实google code链接源码中已经包含了一个完整的android app(github链接的源码貌似有点不同)。

这里只是记录一下调试的过程,将源码import成android project之后运行,有以下几个注意的地方:

1. 源码default.java中

public static final boolean release = true;//可以改成false打开log的开关,方便调试。

2. 遇到“550 Invalid name or chroot violation”(可以从源码中找到打这个log的代码行)的错误,那一定是配置页面中sd卡的路径不正确。

91611d373fd35063963446b5913e1fea.png

对应的代码是在CmdCWD.java文件中,再去分析为什么不对。提醒一点sd卡的根路径有/mnt/sdcard和/storage/sdcard0,跟android版本有关系。

1

//

Ensure the new path does not violate the chroot restriction

2

if

(violatesChroot(newDir)) {

3

errString

=

"

550 Invalid name or chroot violation\r\n

"

;

4

sessionThread.writeString(errString);

5

myLog.l(Log.INFO, errString);

6

break

mainblock;

7

}

3. 在PC上使用的FileZilla这个ftp client测试的,测试连接成功但是无法进行上传删除等操作(提示类似STOR error: 451 Couldn't open file "test.txt" aka  错误log)。

原因是源码manifest.xml中没有设sd卡的读写权限。

4. 上面是测试在同一个wifi网络下,无线ftp可以连接成功。那通过USB的ftp能成功么?

自己调试了一下,也是可以的,不过有以下地方要注意或者要修改的:

6dbcbc060936a67ab0d934e71c47bbaf.png

4.1 USB进行ftp连接,那在client填写的地址是回环地址(就像pc和android用socket连接那样,用127.0.0.1)

4.2 ftp无非也是基于HTTP,底层socket连接的,那pc端必须要执行adb forward tcp:*** tcp:*** 来进行端口转换,因为ftp协议有两个端口,上图中的2121是控制端口,那还有数据传输端口?这个是在源码中动态获取的,在NormalDataSocketFactory.java中的server = new ServerSocket(0, Defaults.tcpConnectionBacklog);这句话。

1

public

int

onPasv() {

2

clearState();

3

try

{

4

//

Listen on any port (port parameter 0)

5

server

=

new

ServerSocket(

0

, Defaults.tcpConnectionBacklog);

6

myLog.l(Log.DEBUG,

"

Data socket pasv() listen successful

"

);

7

return

server.getLocalPort();

8

}

catch

(IOException e) {

9

myLog.l(Log.ERROR,

"

Data socket creation error

"

);

10

clearState();

11

return

0

;

12

}

13

}

自己是暂时改成了server = new ServerSocket(2221, Defaults.tcpConnectionBacklog);也就是2221这个固定端口。在ftp client连接之前,执行adb forward tcp:2121 tcp:2121和

adb forward tcp:2221 tcp:2221这两条命令。然后再连接(无线ftp和USB都可以)都是OK的了。

上面只是个人的一个记录,可能还会有一些问题,先记录一下。

参考资料

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐