|
之前忙着备考,FTP虽然也有敲,但是没有能每次总结。
这两天考试也差不多了,今天好好写了一些,感觉有很大进展和收获,有必要记录一下。
FTP服务端程序的运行流程主要是这样的。主类监听21号端口,当有用户连接是创建一个新线程。线程体run()通过socket(套接字)的输入流接受命令,再通过一个分析命令的函数,将命令转换成int型的标识(总共33个命令),同时把命令所带的参数进行适当的规范化。然后根据最近接收的命令的标识调用相应的函数,完成相应的功能,然后run()向客户端返回执行过程中产生的返回消息(如:“200 command okay.”)。
其实FTP的实现,很多都在使用Java中File类的一些方法。其中一些常用的可以参看->http://shhider.blog.163.com/blog/static/21317619620135227645696/
先来讲一下LIST命令的实现。
其实,LIST方法是要重新在服务端和客户端之间建立一个连接,专门来传输文件列表的数据(端口21就让它专心监听和返回命令、消息)。
不仅是LIST需要建立新的连接,其他许多命令也同样需要。那么,怎么在两者之间建立新的连接才能保证数据的顺利传输呢?这时候,就要谈一谈PORT和PASV的异同了。
在PASV出现之前,就是用的PORT的连接方式,也就是主动连接,客户端发送一个大于1024的端口号给服务端,服务端“主动”使用服务器的20号端口连接客户端的指定端口,从而传输数据。
服务端接受PORT命令后,要记录下这个指定的IP和端口。PORT命令的规定参数形式是:PORT h1,h2,h3,h4,p1,p2 ,全都是整数。h1-h4把逗号换成句号,就是IP地址;p1和p2,通过公式p1*256+p2,得到的就是端口号。一般是要1024 |
|
|