关于FTPClient(Apache的commons.net包下的)研究

来源:互联网 发布:费曼技巧 知乎 编辑:程序博客网 时间:2024/05/17 03:33

经过几年的开发,突然发现到现在自己只涨年限,不涨经验。回想其中缘故:

应了一句老话:黑瞎子掰棒子,掰了一路丢了一路;所以最终也没有剩下什么。

对自己狠狠心,不要太懒就好,当完成一次觉得耗时的且有价值的任务的时候,在每天结束的时候,将其记录下来。记录的过程也是对问题再次理解的过程,书者没有怎么写过文章,有不当之处,希望大家指正;

最近开发的系统,有这么一个需求:项目中需要引用geoserver发布的地图,但是因为系统使用者的问题,需要分权限来做。跟前台做地图的开发人员沟通之后,发现不同通过sld_body的方式来做,一是sld_body的数据量比较大,而且这样做起来效率也不是很高;后来想了一个办法通过动态修改geoserver项目目录下的styles样式文件来生成拥有不同权限的样式文件;这样每次wms请求style样式文件的时候就可以调用不同权限下的数据了。因为考虑到geoserver和自己的系统可能不在同一台电脑上,所以通过ftp来远程操作文件。

因为之前一直没有用过FTP在java中调用远程文件,所以在网上找了些资料,经过一番翻找,发现Apache的FTPClient工具是比较成熟,且稳定的ftp工具。遂在网上找了一个现成的工具类。放在项目中测试,没有问题。因为开发过程中测试只能通过本机或者局域网测试,所以导致测试不全面。当项目部署到服务器之后,用FTPClient的工具类调用远程服务器的文件进行操作的时候,就出现了问题。

首先ftp的远程登录是没有问题的,完全可以登录。但是当我向远程服务器提交删除文件的命令的时候,出现了 500 Invalid PORT Command的错误,在网上查询发现是因为ftp的主动和被动请求的机制的问题。在网上找了一通,并没有发现很有价值且值得参考的文章,所以我就只好通过FTPClient的官方API入手,看是否有价值的提示,在API中的一个常亮的解释中,发现了一丝端倪,API解释如下:

PASSIVE_LOCAL_DATA_CONNECTION_MODE

A constant indicating the FTP session is expecting all transfers to occur between the client (local) and server and that the server is in passive mode, requiring the client to connect to the server's data port to initiate a transfer

该常量的设置是通过下面这个方法实现的:

enterLocalPassiveMode

最后,在每个执行相关fpt操作的方法前我都调用了此方法,完美解决问题。

问题最终解决是通过这么一个原理:既然主动不好使,那么只能通过被动请求咯。

虽然上面的解释有些牵强,但是,问题能得到解决还是很开心,特此记录。

但是通过ftp方位远程服务器,操作文件非常耗时,不知道是我同时操作的文件量多还是,所有ftp操作都是如此,如果有此方面经验的同仁,希望不吝赐教。

0 1
原创粉丝点击