Android开发_swiftp开源ftp服务端移植

swiftp是一个开源的ftp server,源码能够从下面地址拉。java

Google code : http://code.google.com/p/swiftp/downloads/list
GitHub :          https://github.com/ppareit/swiftp
android

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

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

1. 源码default.java中swift

public static final boolean release = true;//能够改为false打开log的开关,方便调试。服务器

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

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

  
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)。app

缘由是源码manifest.xml中没有设sd卡的读写权限。socket

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

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

本身调试了一下,也是能够的,不过有如下地方要注意或者要修改的:

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的了。

 

 

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

参考资料

Android中FTP服务器、客户端搭建以及SwiFTP、ftp4j介绍

相关文章
相关标签/搜索