前言
因为特殊原因,需要在服务器上安装一个代理程序,通过代理程序才能访问到安全域内的一台指定IP服务器。该服务器上安装了FTP服务,需要用程序读写FTP上的文件。
之前在不使用代理程序的服务器上测试FTP连接,没有任何问题,换到这台服务器上有问题,所以记录一下处理过程。
文章目录
- 前言
- 问题发现
- FTPHTTPClient
问题发现
在安装有代理程序的服务器上,通过资源管理器、FTP客户端、FTP Cli 都可以正常进行访问,唯独Java 程序开发的FTPClient 有问题,通过抓包发现,其他的客户端程序在访问时,都会通过代理程序进行网络流量代理,而Java 程序没有走网络代理,FTPClient直接走了网卡的连接。
FTPHTTPClient
翻看整个Apache Net Ftp 相关的API doc 文档,发现FTPClient 有各子类可以针对这种情况进行代理。
就是把之前的 FTPClient 对象换成FTPHTTPClient 对象即可。
/**
* @param hostname 服务器IP或主机名
* @param port 服务器端口号
* @param username 用户名
* @param password 密码
* @return FTPClient
* @Description 检测FTP服务器是否可用
*/
public static boolean checkAlive(String hostname, Integer port, String username, String password) throws IOException {
try {
FTPHTTPClient proxyClient = new FTPHTTPClient("127.0.0.1", 9988);
//设置字符集编码,避免乱码问题
proxyClient.setControlEncoding(CharsetUtil.UTF_8);
//这个设置允许被动连接--访问远程ftp时需
proxyClient.enterLocalPassiveMode();
logger.debug("--------get ftp server ----------");
logger.debug("地址 is -----> " + hostname);
logger.debug("端口 is ---------> " + port);
logger.debug("用户名 is -----> " + username);
logger.debug("密码 is -----> " + password);
logger.debug("--------get ftp server ----------");
proxyClient.connect(hostname, port);
//登录ftp服务器
proxyClient.login(username, password);
//是否成功登录服务器
int replyCode = proxyClient.getReplyCode();
logger.info("是否登录成功--------> " + replyCode);
//return(reply >= 200 && reply < 300)不是这个范围的就是失败
if (!FTPReply.isPositiveCompletion(replyCode)) {
//失败
logger.error("未连接到FTP服务器,用户名或密码错误");
//连接失败,更新FTP服务状态
return false;
} else {
//成功
logger.info("FTP服务器连接成功");
return true;
}
} catch (SocketException e) {
logger.error("创建ftp连接异常");
e.printStackTrace();
return false;
} catch (IOException e){
e.printStackTrace();
logger.error("FTP服务器的IP地址或端口号有误,请正确配置");
return false;
}
}