Android手机使用WIFI及USB建立FTP服务器总结

想必大家经常在PC和Android之间传输文件,并不是每次都会插USB接口进行文件传输,就算是插上USB接口,还是有个问题,那就是Android打开大容量存储模式之后,经常很多软件就会被强制停止使用,而且在弹出设备之后,一些启动器就会把原来归好类的图标变得乱七八糟,之前放在建立好的文件夹里面的APP全跑到文件夹外面来了,这次就是要解决这两个问题。

WIFI建立FTP服务器可能很多人都会说,这个谁不会啊,很多软件都带了,确实,但是在使用中我发现有一些问题。比如说Solid
Explorer和ES
文件管理器,这两个APP都支持建立FTP服务器,但是它们两个都有一个很操蛋的问题,就是建立FTP之后再停止,甚至退出了APP,它都会在后台驻留FTP相关的服务,这对于有后台服务洁癖的我来说是不可忍受的,而且SE的FTP居然不能使用匿名必须要指定密码,本来一个很简单的传个文件还要弄个密码,搞的这么复杂。

我找了很久都没找到一些比较好的解决方法,今天在google play里面瞎逛终于发现了一个很好的免费APP:FTP 服务器(FTP
Server),是由The Olive
Tree开发的,play链接https://play.google.com/store/apps/details?id=com.theolivetree.ftpserver。

之所以说这个APP很好,是以下几个方面。一来是体积很小,除了FTP服务器功能之外什么功能都没有,APP就1.5M不到的体积。二来是完全免费,虽然有付费的pro版,但免费版的功能我还没发现有什么限制,唯一的就是界面上有点广告,但是可以通过一些方法去除(这个就自己去研究吧)。三来是APP的界面设计跟Android
4.x的UI不是太违和。最后是功能比较稳定,试用很多次都没发现有连不上的情况,也没发现有FTP不稳定的情况 。



这个APP支持WIFI,蓝牙PAN,USB,甚至3G网络的FTP建立。其中最重要的是还支持USB
FTP服务器的建立(但是要经过一些处理),这个也是这篇文章的重点要写的地方。



WIFI
FTP服务器的建立很简单,连上WIFI之后,打开APP,按菜单键或右上角的扳手图标进入设置,设置好FTP的端口,被动模式的端口,是否支持匿名登录,FTP主目录,是否是只读FTP这几个选项,返回并保存好设置,再滑到左边的标签页,点一下那个红色的电源开关一样的按钮,WIFI
FTP服务器就做好了,图标变绿色,下面会有IP地址等信息。



下面重点说一下USB的FTP服务器。什么是USB的FTP服务器呢,想必很多人都用过豌豆荚或类似软件管理过Android手机,它们有一个很方便的功能,就是不打开大容量存储就可以管理手机里面的文件,一般会弹出windows的资源管理器窗口,细心的人会发现,弹出的这个窗口的地址是ftp://127.0.0.1,也就是本地环回地址localhost,显然它是在手机端建立了一个FTP服务器的,我们的目的就是不通过豌豆荚建立同样这么一个基于USB的FTP。

这样做有什么好处呢?一来是WIFI传文件速度慢,不稳定;二来是这种方式是基于USB的,速度肯定比无线要快不少,而且很稳定,比较适合传大容量文件,比如说大量的音乐和视频;三来是不用开启大容量存储,就不会上面提到的开启大容量存储传文件的种种问题,而且在一些不支持大容量存储只支持MTP的设备上更方便使用。因为MTP虽然解决了开启大容量存储的一些问题,但是却带来了另外一个致命的问题:设备上的文件通过资源管理器使用MTP协议,经常是显示的内容是完全不同步的!比如说我在手机上删掉了一些文件夹,很有可能你用MTP连接上电脑之后打开资源管理器发现,那些删除的文件夹还在!!!这样你会不会抓狂?

在说这个之前,需要普及一下FTP的基础知识。FTP使用TCP协议,所以是可靠的面向连接的应用层协议。

FTP有两种工作模式,主动模式(PORT)和被动模式(PASV),一般在防火墙外的访问FTP服务器时才使用PASV模式,因为被动模式下服务器端不参与数据的主动传输,只是被动的接受。主动模式下FTP协议默认使用端口是21,实际上是有两个端口的,21端口只是控制端口,就比如在FTP端软件发送列出FTP服务器上的所有文件夹名时发送的指令是属于控制类的指令,它并不直接涉及到文件数据的传输,所以21端口只是控制端口,真正参与数据传输的端口是20端口。而在被动模式下,客户端发送PASV命令到服务器21端口,服务器端会打开一个随机的高于1024的端口,通知客户端,并以此端口来传输数据。FTP的具体的工作原理请参考相关的RFC文档。

还要普及一下android的adb(Android Debug
Bridge)的常识。这个adb是一个为了方便开发者调试程序而做出来的调试桥,从名字就可以看的出来,通过它,PC可以直接通过命令行对android进行一系列的操作,比如说重启手机,在设备上安装apk,把文件push到设备上,从设备上pull出文件等等。我们要实现的功能就必须要通过adb来实现。在手机上开启了FTP服务,但是为什么在电脑上能直接通过ftp://127.0.0.1访问呢?FTP不是一个网络协议吗?此时我只连接了USB啊?很多人肯定会有这样的疑问。确实,手机并没有在网络上和PC连接起来,但这并不代表不能通过网络传输,这不是还有adb这个神奇的东西嘛。adb里面有一个forward的功能,直接翻译过来就是“转发”,可以理解为路由转发那种转发,也可以理解为端口映射那种映射,反正就是类似的功能了,它转发了PC本地端口的数据包到手机里面的对应端口。这下应该能理解了,我们在手机端打开FTP功能,使用adb
forward把需要的几个端口的数据包转发出去,就可以在PC上使用FTP客户端直接连接localhost的相应端口便能直接连接到手机的FTP服务器了,因为adb不是转发了端口的数据包嘛,这样不也一样是通过网络实现了FTP的访问了吗?

好了,现在可以开始实际操作了,在操作之前,你需要准备(具备)以下几个条件:

1、一台开启了USB调试功能的Android手机。

2、在手机上安装了上述提到的FTP Server这个APP。

3、FTP Server选项的“网络接口”里面选择了“回传”或“所有”。

4、PC上安装了一个FTP客户端软件,比如FileZilla、Firefox的FireFTP扩展等。

5、PC上正确安装了手机对应的ADB的驱动程序,表现为:在设备管理器里面的Android
Device下面的设备没有感叹号或问题。

6、一个能跑起来的adb.exe,而且adb device命令能看到你的手机。

7、PC的防火墙要能关闭。



准备好上面这些之后就可以开始了。

1、设置好FTP
Server的。我的设置是:“网络接口”选择“所有”,端口2121,被动端口2300-2301,允许匿名登录。需要说明的是,因为是使用adb的端口转发功能,所以FTP
服务器只能使用被动模式,这就是为什么要指定被动端口的原因。

2、先不要开启FTP
Server的FTP服务,打开手机的USB调试之后,通过USB连接到电脑,确保设备管理器里面能看到“Android
Device”下面的设备而且没有黄色感叹号或问号。

3、打开命令提示符CMD,执行adb
device(建议把adb.exe所在的目录加入系统的环境变量的path以方便操作),确保里面能看到你的Android手机。

4、在CMD里面执行以下这几条命令:

adb forward tcp:2121 tcp:2121

adb forward tcp:2300 tcp:2300

adb forward tcp:2301 tcp:2301

解释一下adb forward的命令参数,从上面一眼就可以看出来了其实,adb forward [本地端口]
[远程端口],也就是把本地的端口和手机上开的端口映射起来。其实就是把第一步设置好的几个端口分别映射一次而已,在被动端口那里尽量把范围不要设的太大,不然要一个个映射很麻烦,一个好像也可以,不过保险起见我还是设置了两个。

5、执行adb forward --list 看看结果是不是和刚才设置好的forward的端口一致。

6、在手机上打开FTP
Server的FTP,并使用PC的FTP客户端打开ftp://127.0.0.1:2121,此时应该一下子就能显示出来设置好的FTP目录里面的文件和文件夹了,接下来就可以使用FTP客户端对文件进行操作啦


7、如果不行,请关闭防火墙再试。

8、如果还不行,检查一下刚才定义的三个端口是不是被adb.exe在监听。方法:打开windows的系统资源监视器(resmon.exe),“网络”,“侦听端口”,按端口号排序,看一下刚才设置的几个端口是不是被adb.exe监听。

整个过程看起来很复杂,实际上很简单,我只是写的有点多而已,我一直认为授之以鱼不如授之以渔,希望我的文章能帮到哪怕一个人,那也就达到我分享经验的目的。

iwantcomputer@gmail.com原创,留于2013.12.28晚

上一篇:Windows下建立FTP服务器站点


下一篇:VB中将类标记为可序列化