Apache Commons Net มี FTPHTTPClient สำหรับ FTP ผ่านพร็อกซี HTTP CONNECT จุดเด่นที่มีประโยชน์ไม่ใช่แค่การไปถึงพอร์ตล็อกอิน FTP เท่านั้น แต่ยังสร้างอุโมงค์พร็อกซีสำหรับการเชื่อมต่อข้อมูลแบบพาสซีฟที่ใช้โดยรายการและการถ่ายโอนไฟล์ด้วย

คอนสตรักเตอร์รับปลายทางของพร็อกซีและข้อมูลรับรองพร็อกซีแบบไม่บังคับ เซิร์ฟเวอร์ FTP ยังคงเป็นอาร์กิวเมนต์ของ connect และ login รับบัญชี FTP:

FTPHTTPClient ftp = new FTPHTTPClient(
    "proxy.example.net", 8080, proxyUser, proxyPassword
);

try {
    ftp.connect("ftp.example.net", 21);
    if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
        throw new IOException(ftp.getReplyString());
    }
    if (!ftp.login(ftpUser, ftpPassword)) {
        throw new IOException(ftp.getReplyString());
    }

    ftp.enterLocalPassiveMode();
    if (!ftp.setFileType(FTP.BINARY_FILE_TYPE)
            || !ftp.retrieveFile(remoteFile, output)) {
        throw new IOException(ftp.getReplyString());
    }
    ftp.logout();
} finally {
    if (ftp.isConnected()) {
        ftp.disconnect();
    }
}

ส่วนการถ่ายโอนนี้ถือว่ามีการนำเข้า FTP ของ Commons Net, java.io.IOException, ตัวแปรข้อมูลรับรองที่แอปพลิเคชันจัดให้ และสตรีมเอาต์พุตที่เป็นของผู้เรียก remoteFile คือชื่อไฟล์ที่ต้องการฝั่งเซิร์ฟเวอร์ แอปพลิเคชันยังต้องปิดสตรีมเอาต์พุตของตนในจังหวะที่เหมาะสม

ตั้งโหมดพาสซีฟหลังจากเชื่อมต่อและก่อนการดำเนินการข้อมูล การใช้งานของ FTPHTTPClient จะปฏิเสธการเชื่อมต่อข้อมูลในโหมดแอกทีฟ ในโหมดพาสซีฟจะเจรจาปลายทางข้อมูลกับ FTP และเปิดการเชื่อมต่ออีกครั้งไปยังพร็อกซี HTTP จากนั้นขออุโมงค์ CONNECT ไปยังปลายทางนั้น

อุโมงค์ที่สองนี้อธิบายขอบเขตที่พบบ่อย: การอนุญาตพร็อกซีสำหรับพอร์ตควบคุม FTP ไม่เพียงพอ ปลายทางและพอร์ตที่อนุญาตต้องรวมปลายทางข้อมูลแบบพาสซีฟของเซิร์ฟเวอร์ด้วย การทักทายและล็อกอินที่สำเร็จพิสูจน์เพียงว่าเส้นทางควบคุมทำงานได้

การใช้งานจัดให้มีการรับรองพร็อกซีแบบ Basic เมื่อมีทั้งชื่อผู้ใช้และรหัสผ่านของพร็อกซี ซึ่งแตกต่างจากการแลกเปลี่ยน FTP USER/PASS พร็อกซีที่ต้องการกลไกการรับรองอื่นต้องใช้คอนเนกเตอร์ที่เข้ากันได้ คอนสตรักเตอร์ไม่ได้ทำให้ทุกสกีมใช้งานได้

Commons Net จัดทำเอกสารคลาสนี้ว่าเป็นคลาสทดลอง ดังนั้นควรประเมินกับความต้องการของแอปพลิเคชันและพร็อกซีก่อนนำไปใช้ มันเป็นไคลเอนต์ FTP ไม่ใช่ไคลเอนต์ FTPS หรือ SFTP สำหรับ FTPS ที่มีบริการ SOCKS อินเทอร์เฟซซ็อกเก็ต-พร็อกซีของ FTPSClient เป็นเส้นทางไคลเอนต์แยกต่างหาก CONNECT ให้เส้นทางและไม่ได้เข้ารหัสข้อมูลรับรอง FTP หรือเนื้อหาไฟล์ด้วยตัวเอง

เก็บข้อผิดพลาดไว้กับขั้นตอนที่ทำให้เกิด: การปฏิเสธ HTTP ระหว่างการตั้งอุโมงค์ การปฏิเสธการล็อกอิน FTP หรือความล้มเหลวในการถ่ายโอน FTP/ข้อมูล การเปลี่ยนรหัสผ่าน FTP ไม่สามารถแก้ไขนโยบายพร็อกซีที่ปฏิเสธพอร์ตข้อมูลแบบพาสซีฟได้

บทความที่เกี่ยวข้อง