You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用it.sauronsoftware.ftp4j.FTPClient连接SFTP报错求助

在it.sauronsoftware.ftp4j.FTPClient中使用SFTP的解决方案

ftp4j 不支持SFTP协议,这是你遇到报错的核心原因。SFTP是基于SSH的文件传输协议,而ftp4j仅支持标准FTP、FTPS(显式/隐式SSL/TLS加密的FTP)以及FTPES(显式FTP over SSL),和SFTP属于完全不同的协议体系。

你的报错原因解析

  • 使用FTPClient.SECURITY_FTPES报错:FTPES是显式SSL加密的FTP协议,若目标服务器是SFTP服务器,无法识别FTPES的握手请求,会返回非法响应,导致连接失败。
  • 使用FTPClient.SECURITY_FTPS报错:FTPS依赖SSL/TLS握手,而SFTP服务器默认监听SSH端口(22),当你用FTPS的SSL握手逻辑连接SSH端口时,服务器返回的SSH握手信息无法被SSL解析,因此抛出Unsupported or unrecognized SSL message错误。

正确的SFTP连接方案

要连接SFTP服务器,需使用支持SSH/SFTP的Java库,以下是两种常用方案:

方案1:使用JSch(主流SSH/SFTP客户端库)

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.ChannelSftp;

public class SftpConnector {
    public static void main(String[] args) {
        String host = "你的SFTP服务器地址";
        int port = 22; // SFTP默认端口
        String username = "你的用户名";
        String password = "你的密码";

        JSch jsch = new JSch();
        try {
            Session session = jsch.getSession(username, host, port);
            session.setPassword(password);
            // 生产环境建议配置主机密钥验证,此处为测试跳过
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();

            ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
            sftpChannel.connect();

            // 示例:上传本地文件到服务器
            sftpChannel.put("本地文件路径", "服务器目标路径");

            sftpChannel.disconnect();
            session.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方案2:使用Apache Commons VFS(统一文件系统API)

适合需要同时处理多种文件协议(FTP/SFTP/本地文件等)的场景,通过统一API实现SFTP操作,无需关注底层协议细节。

内容的提问来源于stack exchange,提问作者SAFSAF SAFSAF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:52:13