因为需要监控服务器某个目录下是否产生了javacore文件,而又不想在服务器上跑代理程序,也就想了个“歪点子”:定时使用FTP服务,查看该目录下文件情况。
一开始使用了sun.net.ftp.FtpClient包,它是内置在JDK中的,使用起来还算简单,但是正是这种简单,导致它的功能并不强。比如仅提供列举文件清单,不提供文件相关信息。
后来发现有个org.apache.commons.net.ftp.FTP包,可以列举文件的很多属性,如大小,所有者等。于是二话不说就开始试用,当时直接就把原来的sun类干掉,直接用apache的类,却发现根本没法用,调用listFiles总是获得null,照搬网上的方法都不行。翻来覆去怎么都搞不定,网上关于此问题的解决方法似乎也不行。而且还很复杂。最后无奈之下只能回退,幸亏eclipse有history功能,节省了不少时间。
昨天晚上看了apache的FTP包介绍,似乎功能非常强,所以今天上午再次研究了一下,无意中发现网上有个伙计自己建的类里面有个把使用过程中的命令输出到控制台的做法,想到这样可以辅助查找原因。由此发现了问题所在:连接服务器后对服务器发送了SYST命令,服务器返回了错误:
SYST
215 UNIX Type: L8 Version: BSD-44
PORT 127,0,0,1,94,51
501 IP Address for data destination doesn't match client's.
215 UNIX Type: L8 Version: BSD-44
PORT 127,0,0,1,94,51
501 IP Address for data destination doesn't match client's.
由此想到连接服务器的方式问题,于是在连接之后调用一次enterLocalPassiveMode方法。
最终通过。
最后附上原帖地址:《使用org.apache.commons.net.ftp包开发FTP客户端,实现进度汇报,实现断点续传,中文支持》