Android开发_swiftp开源ftp服务端移植
2013-12-26 01:29
567 查看
swiftp是一个开源的ftp server,源码可以从下面地址拉。
Google code : http://code.google.com/p/swiftp/downloads/list
GitHub : https://github.com/ppareit/swiftp
自己的需求是将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卡的路径不正确。
对应的代码是在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卡的读写权限。
<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介绍
Google code : http://code.google.com/p/swiftp/downloads/list
GitHub : https://github.com/ppareit/swiftp
自己的需求是将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卡的路径不正确。
对应的代码是在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卡的读写权限。
<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介绍
相关文章推荐
- Android基于SwiFTP开源库的FTP实现(FTP匿名登录)
- 移植开源项目obexftp到android平台下实现蓝牙ftp的功能
- android开发过程中用到的一些开源框架
- 开源 AR 安卓APP:android AR app 开发及源码
- 2017年,身为Android开发的你必须要掌握的热门开源框架
- android开发之&android中的swift,android studio 安装kotlin插件
- Android开源项目第四篇——开发及测试工具篇
- android系统开发(十)-audio移植一 .
- 近百个Android优秀开源项目,覆盖Android开发的每个领域
- 开发android app,你会用到哪些开源框架?
- Android系统开发之tslib移植
- Android开发那点事-服务端
- 2016年公司中开发中常用的Swift和iOS开源框架
- Android平台开发-WIFI 驱动移植 -- 详细-不错
- Android开发之UI的开源组件
- 深入浅出 - Android系统移植与平台开发(三)- 编译并运行Android4.0模拟器
- Android开源实战:使用MVP+Retrofit开发一款文字阅读APP
- 普渡大学开发了可延长 Android 电池 16% 的寿命的开源软件
- android 插件化开发 开源项目列表
- 深入浅出 - Android系统移植与平台开发(十) - led HAL简单设计案例分析