421错误原因:
同时连接该ftp的人数过多,一般ftp网站都有同时登陆人数的上限,超过该上限就会出现421错误。
分析:
- 连接超时或者数据传输超时
- 主动被动模式选择不符合网络环境
- FtpService服务器的线程数量配置
基础知识:
FTP只通过TCP连接,没有用于FTP的UDP组件.FTP不同于其他服务的是它使用了两个端口, 一个数据端口和一个命令端口(或称为控制端口)。通常
21端口是命令端口,20端口是数据端口。当混入主动/被动模式的概念时,数据端口就有可能不是20了。
解决方案:
1. 连接超时或者数据传输超时
ftpClient.setDataTimeout(60000); //设置传输超时时间为60秒
ftpClient.setConnectTimeout(60000); //连接超时为60秒
2. 主动被动模式选择不符合网络环境
主动模式:
命令连接:客户端 >1023端口 -> 服务器 21端口
数据连接:客户端 >1023端口 <- 服务器 20端口
主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。
被动模式:
命令连接:客户端 >1023端口 -> 服务器 21端口
数据连接:客户端 >1023端口 -> 服务器 >1023端口
被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。
折中方式:
既然FTP服务器的管理员需要他们的服务器有最多的客户连接,那么必须得支持被动FTP。我们可以通过为FTP服务器指定一个有限的端口范围来减小服务器高位端口的暴露。这样,不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除所有针对服务器的危险,但它大大减少了危险。
服务端是两种模式的,使用哪种模式取决于客户端,同时关键点在于网络环境适合用哪种模式,比如客户端在防火墙内,则最好选择被动模式
。
ftpClient.enterLocalActiveMode()便是配置成主动模式
ftpClient.enterLocalPassiveMode()则配置成被动模式。
FTP主动模式和被动模式的区别参考:https://www.cnblogs.com/ajianbeyourself/p/7655464.html
3. FtpService服务器的线程数量配置
在res\conf目录中找到ftpd-typical.xml文件,添加最大登录数等配置
<server xmlns="http://mina.apache.org/ftpserver/spring/v1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://mina.apache.org/ftpserver/spring/v1
http://mina.apache.org/ftpserver/ftpserver-1.0.xsd"
id="myServer" /*设置server的标志符,必须*/
max-logins="5" /*设置同时登陆的最大人数*/
anon-enabled="false" /*设置匿名登陆为不允许*/
max-anon-logins="0" /*设置匿名登陆用户为0个*/
max-login-failures="3" /*设置3次失败登陆后,关闭此链接*/
/*设置失败登陆后下一次登陆所需的时间间隔,防止暴力破解,单位是微秒*/
login-failure-delay="30000">
<listeners>
<!--设置默认的链接端口为2121,必须-->
<nio-listener name="default" port="2121">
<ssl>
<!--设置密钥存储路径和密钥存储密码,必须-->
<keystore file="./res/ftpserver.jks" password="password" />
</ssl>
<!--设置多少时间后关闭一个闲置的链接,单位是秒-->
<data-connection idle-timeout="60">
<!--设置主动链接配置,端口号“1886”-->
<active local-port="1886"/>
<!--设置被动链接配置,端口设置为“1886”,扩展地址为“137.222.18.114”,当需要访问的服务器返回外网地址时使用-->
<passive ports="1886" address="0.0.0.0" external-address="137.222.18.114"/>
</data-connection>
</nio-listener>
</listeners>
<!--设置用户登陆信息,“./res/conf/users.properties”为文件路径,“encrypt-passwords=‘clear’”设置密码加密方式,默认是“MD5”,设置成“clear”表示不加密,直接输入-->
<file-user-manager file="./res/conf/users.properties" encrypt-passwords="clear"/>
</server>
Server元素详解
最大线程数max-threads这个提高了应该提高处理客户端连接的速度。
ftpd-typical.xml配置可参考官网:http://mina.apache.org/ftpserver-project/configuration_listeners.html
或者中文文档https://wenku.baidu.com/view/5f0ab75f312b3169a451a4d8.html