Apache Commons Net-এ HTTP CONNECT প্রক্সির মাধ্যমে FTP-র জন্য FTPHTTPClient রয়েছে। এর উপকারী বৈশিষ্ট্য শুধু 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();
    }
}

এই স্থানান্তর খণ্ডটি Commons Net-এর FTP ইমপোর্ট, java.io.IOException, অ্যাপ্লিকেশন-প্রদত্ত ক্রেডেনশিয়াল ভেরিয়েবল এবং কলারের মালিকানাধীন একটি আউটপুট স্ট্রিম ধরে নেয়। remoteFile হলো সার্ভার-পাশের অভীষ্ট ফাইলনাম। অ্যাপ্লিকেশনকে যথাযথ স্থানে নিজের আউটপুট স্ট্রিমও বন্ধ করতে হবে।

সংযোগের পরে এবং ডেটা অপারেশনের আগে প্যাসিভ মোড সেট করুন। FTPHTTPClient-এর বাস্তবায়ন সক্রিয় মোডে ডেটা সংযোগ প্রত্যাখ্যান করে। প্যাসিভ মোডে এটি FTP-র সঙ্গে ডেটা এন্ডপয়েন্ট নিয়ে আলোচনা করে এবং HTTP প্রক্সিতে আরেকটি সংযোগ খোলে, তারপর সেই এন্ডপয়েন্টে একটি CONNECT টানেল অনুরোধ করে।

সেই দ্বিতীয় টানেল একটি সাধারণ সীমা ব্যাখ্যা করে: FTP নিয়ন্ত্রণ পোর্টের জন্য প্রক্সি অনুমতি যথেষ্ট নয়। অনুমোদিত গন্তব্য ও পোর্টে সার্ভারের প্যাসিভ ডেটা এন্ডপয়েন্ট অন্তর্ভুক্ত থাকতে হবে। সফল অভিবাদন ও লগইন কেবল প্রমাণ করে নিয়ন্ত্রণ পথটি কাজ করেছে।

প্রক্সি ব্যবহারকারীনাম ও পাসওয়ার্ড উভয়ই থাকলে বাস্তবায়ন Basic প্রক্সি প্রমাণীকরণ সরবরাহ করে। এটি FTP USER/PASS বিনিময় থেকে আলাদা। অন্য প্রমাণীকরণ পদ্ধতি চাওয়া প্রক্সির জন্য উপযুক্ত কানেক্টর দরকার; কনস্ট্রাক্টর সব স্কিম উপলব্ধ করে না।

Commons Net এই ক্লাসকে পরীক্ষামূলক হিসেবে নথিভুক্ত করে, তাই গ্রহণের আগে অ্যাপ্লিকেশন ও প্রক্সির চাহিদার সঙ্গে এটি মূল্যায়ন করুন। এটি FTP ক্লায়েন্ট, FTPS বা SFTP ক্লায়েন্ট নয়। SOCKS পরিষেবা থাকলে FTPS-এর জন্য FTPSClient-এর সকেট-প্রক্সি ইন্টারফেস একটি আলাদা ক্লায়েন্ট পথ। CONNECT পথটি দেয় এবং নিজে FTP ক্রেডেনশিয়াল বা ফাইলের বিষয়বস্তু এনক্রিপ্ট করে না।

ত্রুটিগুলো যে পর্যায়ে ঘটেছে তার সঙ্গে যুক্ত রাখুন: টানেল স্থাপনের সময় HTTP প্রত্যাখ্যান, FTP লগইন অস্বীকৃতি, বা FTP/ডেটা স্থানান্তর ব্যর্থতা। FTP পাসওয়ার্ড বদলে প্যাসিভ ডেটা পোর্ট প্রত্যাখ্যানকারী প্রক্সি নীতি সমাধান করা যায় না।

সম্পর্কিত নিবন্ধ