首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java FTP 上傳報 SocketException: Software caused connection abort:防火牆阻擋被動模式資料連線

     編輯:程式設計疑難解答

錯誤堆疊關鍵

java.net.SocketException: Software caused connection abort: recv failed
at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:812)
at org.apache.commons.net.ftp.FTPClient._storeFile(FTPClient.java:633)

根本原因

FTP **被動模式**下,客戶端需向伺服器隨機高埠建立資料連線。客戶端(Windows 7)防火牆**公用網路設定檔**啟用且未放行 Java 程式/高埠範圍,導致資料連線被截斷。命令連線(21 埠)正常,故登入成功、列表目錄正常,唯獨上傳/下載失敗。

解決方案

  1. 關閉防火牆公用網路設定檔(測試環境):
    控制台 → 系統與安全性 → Windows Defender 防火牆 → 開啟或關閉 → 公用網路「關閉」。
  2. 生產環境精準放行:
    新增輸入規則 → 連接埠 → TCP → 特定本地埠:1024-65535(或 vsftpd pasv_min_port-pasv_max_port 範圍)→ 允許連線 → 套用至「公用」。
  3. FTP 伺服器指定被動埠範圍(vsftpd.conf):
    pasv_min_port=50000
    pasv_max_port=51000
    防火牆僅需開放此 1000 埠範圍。
  4. 代碼端強制主動模式(不推薦,需客戶端有公網 IP):
    ftpClient.enterLocalActiveMode();

驗證步驟

  1. 關閉防火牆後重跑 JUnit 測試,上傳成功。
  2. 使用 FileZilla 客戶端同樣設定測試,確認伺服器端無誤。

補充:Linux 客戶端

CentOS firewall-cmd --add-service=ftp --permanent 僅開放命令埠,**仍需** --add-port=50000-51000/tcp 開放被動埠範圍。

問題本質:**FTP 雙通道特性 + 防火牆預設阻擋入站高埠**,而非 Java 代碼或 Commons Net 庫缺陷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved