如何用Java代码实现FTP链接服务器?Java连接FTP服务器代码示例

在 Java 中连接 FTP 服务器,最常用且推荐的方式是使用 Apache Commons Net 库,它提供了稳定、易于使用的 API 来处理 FTP、FTPS 和 SFTP 协议。

下面我将提供两种常见场景的代码示例:

Java小案例 - 网络编程 - 实现简单的客户端与服务器端连接传输
加载中
Java小案例 - 网络编程 - 实现简单的客户端与服务器端连接传输
  1. 标准 FTP 连接(明文传输,端口 21)
  2. FTPS 连接(加密传输,推荐用于生产环境)

✅ 前置依赖

如果你使用 Maven,请在 pom.xml 中添加以下依赖:

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.9.0</version> <!-- 请使用最新版本 -->
</dependency>

⚠️ 注意:Apache Commons Net 不直接支持 SFTP(SSH File Transfer Protocol),SFTP 需要使用 JSch 或 Apache Commons VFS 等库,本文聚焦于 FTP/FTPS。


📌 示例 1:标准 FTP 连接(非加密)

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import java.io.IOException;
public class FtpExample {
    public static void main(String[] args) {
        String host = "ftp.example.com";
        int port = 21;
        String username = "your_username";
        String password = "your_password";
        FTPClient ftpClient = new FTPClient();
        try {
            // 连接服务器
            ftpClient.connect(host, port);
            System.out.println("Connected to " + host);
            // 登录
            boolean loginSuccess = ftpClient.login(username, password);
            if (!loginSuccess) {
                System.out.println("Login failed!");
                return;
            }
            System.out.println("Logged in successfully.");
            // 检查响应码
            int reply = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
                System.err.println("Server refused connection.");
                return;
            }
            // 设置被动模式(推荐,尤其通过防火墙/NAT 时)
            ftpClient.enterLocalPassiveMode();
            // 设置文件类型为二进

如何用Java代码实现FTP链接服务器?Java连接FTP服务器代码示例

制(避免文件损坏) ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 示例:列出根目录文件 String[] files = ftpClient.listNames(); if (files != null) { for (String file : files) { System.out.println("File: " + file); } } // 断开连接 ftpClient.logout(); System.out.println("Disconnected."); } catch (IOException e) { e.printStackTrace(); } finally { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ex) { ex.printStackTrace(); } } } } }

🔒 示例 2:FTPS 连接(显式 SSL/TLS 加密)

FTPS 是 FTP over SSL,更安全,使用 FTPClient 并启用 SSL 即可。

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.KeyStore;
import java.security.Security;
public class FtpsExample {
    public static void main(String[] args) {
        String host = "ftps.example.com";
        int port = 990; // 或 21(显式模式)
        String username = "your_username";
        String password = "your_password";
        FTPClient ftpClient = new FTPClient();
        try {
            // 可选:配置 SSL 上下文(如需要自定义信任库)
            // SSLContext sslContext = createSSLContext();
            // ftpClient.execPBSZ(0);
            // ftpClient.execPROT("P");
            // ftpClient.setAuthSSL(sslContext);
            // 连接(显式 FTPS,端口通常为 21)
            ftpClient.connect(host, port);
            System.out.println("Connected to " + host);
            // 登录
            boolean loginSuccess = ftpClient.login(username, password);
            if (!loginSuccess) {
                System.out.println("Login failed!");
                return;
            }
            System.out.println("Logged in successfully.");
            int reply = ftpClient.getReplyCode();
            if (!FTPReply

如何用Java代码实现FTP链接服务器?Java连接FTP服务器代码示例

.isPositiveCompletion(reply)) { ftpClient.disconnect(); System.err.println("Server refused connection."); return; } // 启用显式 FTPS(自动处理 SSL 握手) ftpClient.execPBSZ(0); ftpClient.execPROT("P"); // 数据通道也加密 // 被动模式 ftpClient.enterLocalPassiveMode(); // 二进制模式 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 示例:列出文件 String[] files = ftpClient.listNames(); if (files != null) { for (String file : files) { System.out.println("File: " + file); } } ftpClient.logout(); System.out.println("Disconnected."); } catch (IOException e) { e.printStackTrace(); } finally { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ex) { ex.printStackTrace(); } } } } // 如需自定义信任库,可取消注释并实现此方法 / private static SSLContext createSSLContext() throws Exception { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); try (FileInputStream fis = new FileInputStream("truststore.jks")) { trustStore.load(fis, "changeit".toCharArray()); } TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(trustStore); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, tmf.getTrustManagers(), null); return sslContext; } / }

📤 上传/下载文件示例

上传文件

import java.io.FileInputStream;
import java.io.IOException;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
public boolean uploadFile(FTPClient ftpClient, String remotePath, String localFilePath) throws IOException {
    try (FileInputStream inputStream = new FileInputStream(localFilePath)) {
        boolean success = ftpClient.storeFile(remotePath, inputStream);
        if (success) {
            System.out.println("File uploaded successfully: " + remotePath);
        } else {
            System.out.println("Upload failed for: " + remotePath);
        }
        return success;
    }
}

如何用Java代码实现FTP链接服务器?Java连接FTP服务器代码示例

下载文件

import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.commons.net.ftp.FTPClient;
public boolean downloadFile(FTPClient ftpClient, String remoteFilePath, String localFilePath) throws IOException {
    try (FileOutputStream outputStream = new FileOutputStream(localFilePath)) {
        boolean success = ftpClient.retrieveFile(remoteFilePath, outputStream);
        if (success) {
            System.out.println("File downloaded successfully: " + remoteFilePath);
        } else {
            System.out.println("Download failed for: " + remoteFilePath);
        }
        return success;
    }
}

⚠️ 注意事项

  1. 被动模式(Passive Mode):始终调用 ftpClient.enterLocalPassiveMode(),否则在 NAT/防火墙后可能无法传输数据。
  2. 字符编码:如果文件名包含中文,需设置编码:
    ftpClient.setControlEncoding("UTF-8");
  3. 资源关闭:务必在 finally 块中关闭 FTPClient 和输入/输出流,避免资源泄漏。
  4. FTPS vs SFTP:
  5. 超时设置:可设置连接和数据超时:
    ftpClient.setConnectTimeout(5000); // 5秒
    ftpClient.setDataTimeout(30000);   // 30秒

协议 库 是否加密 推荐场景
FTP commons-net 内网、测试环境
FTPS commons-net + SSL 外网、生产环境
SFTP JSch 或 VFS SSH 环境、高安全要求

如需 SFTP 示例,请告诉我,我可以提供 JSch 的实现代码。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/482293.html

赞 (0)
python棋怎么玩?python零基础入门教程
上一篇 2026年7月11日 17:06
pyethereum python是什么?pyethereum python教程
下一篇 2026年7月11日 17:09

相关推荐

  • ajaxfileuploadjs上传报错怎么办?ajaxfileuploadjs上传文件失败解决方法

    使用ajaxfileupload.js实现文件上传的核心在于利用隐藏的iframe模拟表单提交,从而绕过浏览器的同源策略限制,实现无刷新上传,但需注意其仅支持传统表单提交方式,无法直接处理JSON响应,在Web开发的历史长河中,文件上传一直是一个让前端开发者头疼的难题,虽然HTML5标准引入了FormData对……

    2026年6月7日
    4600
  • 服务器502是什么问题,502 Bad Gateway错误原因及解决方法

    服务器 502 是什么问题502 Bad Gateway(错误网关)的核心本质是:上游服务器(如应用服务器、后端数据库或 API 服务)未能向网关或代理服务器(如 Nginx、Apache、CDN)返回有效的响应,导致网关无法将正确的内容传递给客户端, 这并非用户本地网络故障,而是服务器端通信链路中的“断链”或……

    程序编程 2026年4月19日
    1.7K00
  • WebHorizon日本IPv6 VPS好用吗?日本VPS推荐高性价比

    WebHorizon推出的日本IPv6 VPS以$12/年的极低价格提供1核768MB内存及100GB流量,是预算有限且追求高带宽性价比用户的理想选择,在云计算市场日益内卷的2026年,寻找稳定且廉价的海外服务器资源变得愈发困难,WebHorizon近期上架的日本节点产品,凭借极具攻击性的定价策略,迅速在技术社……

    2026年6月19日
    3900
  • 广播式网络分为三种?广播式网络有哪些类型

    点对点、多点广播与广播风暴式网络,其核心差异在于数据包的寻址机制与传输范围,广播式网络的三种核心形态点对点广播网络(单播)点对点广播并非传统意义的“广播”,而是广播网络的基础寻址模式,数据包带有明确的目的地址,仅被目标节点接收,寻址机制:MAC地址精准匹配,网卡硬件过滤非本机帧,资源消耗:随节点数量线性增长,N……

    2026年4月25日
    7000
  • ASP中注释符号究竟有几种?各自如何使用?

    ASP中的注释符号主要用于在代码中添加说明性文字,这些注释不会被服务器执行,因此不会影响程序运行,正确使用注释能提高代码可读性、便于团队协作和维护,ASP支持两种主要的注释方式:单行注释和HTML注释,每种方式各有其适用场景和注意事项,ASP单行注释符号单行注释使用单引号(’)实现,所有在单引号后的内容都会被A……

    2026年2月4日
    14030
  • 如何实现ajax实时读取数据库?ajax实时读取数据库教程

    通过AJAX技术实现数据库的实时读取,核心在于利用JavaScript在后台异步请求数据并局部刷新页面,从而避免整页重载,显著提升用户体验与系统响应速度,在传统的Web开发模式中,用户每次交互往往需要刷新整个网页才能看到最新数据,这种“全有或全无”的加载方式不仅浪费带宽,更让等待变得难以忍受,随着前端技术的演进……

    2026年6月1日
    4300
  • 服务器ip和端口号怎么查?服务器ip地址和端口查看方法

    服务器IP地址与端口号的精准配置与协同工作,是构建稳定、高效网络服务的核心基石,二者共同构成了网络通信的唯一标识,缺一不可,IP地址负责在复杂的网络环境中精准定位目标主机,而端口号则负责将数据流量引导至主机内特定的应用程序,这种“地址+门牌号”的协作机制,确保了互联网数据传输的准确性与秩序性,理解并掌握这两者的……

    2026年4月2日
    9000
  • 江苏防攻击服务器怎么选型,DDoS和CC防护的区别是什么?

    选江苏防攻击服务器,核心是分清DDoS打流量和CC耗资源的区别,先确定业务是怕被堵死带宽还是被刷垮CPU,再针对性匹配防御策略,这样选型才不会白花钱,江苏防攻击服务器选型第一步:彻底搞懂DDoS攻击与CC攻击区别很多人在租服务器时开口就问“能不能防攻击”,但业务被攻击的方式千差万别,拿最常见的DDoS和CC来说……

    2026年8月10日
    600
  • 搬瓦工MINICHICKEN套餐$17.7/年值得买吗,搬瓦工VPS优惠码领取

    搬瓦工限量MINICHICKEN套餐以$17.7/年的超低价格正式开放,这是目前弗里蒙特机房性价比最高的入门级VPS方案,前50名用户可通过文中邀请码直接锁定名额,在VPS租赁市场,价格敏感型用户往往需要在性能与成本之间做艰难取舍,搬瓦工(BandwagonHost)此次推出的MINICHICKEN套餐,打破了……

    2026年7月4日
    16310
  • Win7代理服务器让网如何设置?,设置步骤?

    在Windows 7系统中设置代理服务器上网,只需在Internet选项的局域网设置中填写正确的代理服务器地址和端口,并勾选“为LAN使用代理服务器”即可完成配置,所有基于IE的应用程序都会自动走代理,win7代理服务器怎么设置详细步骤手动配置win7代理服务器是最直接的方法,完全不需要安装第三方软件,整个操作……

    2026年8月21日
    1000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注