Pustaka klien FTP Java telah ditinjau

Mari kita bayangkan situasi di mana kita ingin menulis aplikasi Java murni yang harus mengunduh file dari komputer jarak jauh yang menjalankan server FTP. Kami juga ingin memfilter unduhan berdasarkan informasi file jarak jauh seperti nama, tanggal, atau ukuran.

Meskipun mungkin, dan mungkin menyenangkan, untuk menulis penangan protokol untuk FTP dari awal, melakukannya juga sulit, lama, dan berpotensi berisiko. Karena kami lebih suka tidak menghabiskan waktu, tenaga, atau uang untuk menulis penangan sendiri, kami lebih suka menggunakan kembali komponen perangkat lunak yang ada. Dan banyak perpustakaan tersedia di World Wide Web. Dengan pustaka klien FTP, mengunduh file dapat ditulis dalam Java sesederhana:

FTPClient ftpClient = FTPClient baru (); ftpClient.connect ("ftp.foo.com", "user01", "pass1234"); ftpClient.download ("C: \\ Temp \\", "README.txt"); // Akhirnya operasi lain di sini ... ftpClient.disconnect ();

Mencari pustaka klien FTP Java berkualitas yang sesuai dengan kebutuhan kita tidak sesederhana kelihatannya; itu bisa sangat menyakitkan. Butuh beberapa saat untuk menemukan pustaka klien FTP Java. Lalu, setelah kita menemukan semua library yang ada, yang mana yang kita pilih? Setiap perpustakaan memenuhi kebutuhan yang berbeda. Kualitas perpustakaan tidak setara, dan desainnya berbeda secara fundamental. Masing-masing menawarkan serangkaian fitur yang berbeda dan menggunakan jenis jargon yang berbeda untuk mendeskripsikannya.

Dengan demikian, mengevaluasi dan membandingkan pustaka klien FTP terbukti sulit dan membingungkan. Menggunakan kembali komponen yang ada adalah proses yang patut dipuji, tetapi dalam kasus ini, memulai dapat mengecilkan hati. Dan ini memalukan: setelah memilih pustaka FTP yang bagus, sisanya rutin.

Artikel ini bertujuan agar proses seleksi tersebut singkat, mudah, dan bermanfaat. Saya pertama-tama mencantumkan semua pustaka klien FTP yang tersedia. Kemudian saya mendefinisikan dan mendeskripsikan daftar kriteria relevan yang harus ditangani perpustakaan dengan cara tertentu. Akhirnya, saya menyajikan matriks ikhtisar yang memberikan gambaran singkat tentang bagaimana perpustakaan saling bertumpuk. Semua informasi ini memberikan semua yang kami butuhkan untuk membuat keputusan yang cepat, andal, dan tahan lama.

Dukungan FTP di JDK

Spesifikasi referensi untuk FTP adalah Request for Comments: 959 (RFC959). Sun Microsystems menyediakan implementasi RFC959 di JDK, tetapi itu internal, tidak berdokumen, dan tidak ada sumber yang disediakan. Meskipun RFC959 berada dalam bayang-bayang, ini sebenarnya adalah ujung belakang antarmuka publik yang menerapkan RFC1738, spesifikasi URL, seperti yang diilustrasikan pada Gambar 1.

Penerapan RFC1738 ditawarkan sebagai standar di JDK. Itu melakukan pekerjaan yang wajar untuk operasi transfer FTP dasar. Ini publik dan didokumentasikan, dan kode sumber disediakan. Untuk menggunakannya, kami menulis yang berikut ini:

URL url = URL baru ("ftp: // user01: [email protected]/README.txt; type = i"); URLConnection urlc = url.openConnection (); InputStream adalah = urlc.getInputStream (); // Untuk mengunduh OutputStream os = urlc.getOutputStream (); // Untuk mengunggah

Dukungan klien FTP di JDK secara ketat mengikuti rekomendasi standar, tetapi memiliki beberapa kelemahan:

  • Ini pada dasarnya berbeda dari perpustakaan klien FTP pihak ketiga; ini menerapkan RFC959 daripada RFC1738.
  • RFC959 diterapkan di sebagian besar alat klien FTP desktop. Banyak programmer Java menggunakan alat ini untuk terhubung ke server FTP. Sesuai selera, alat ini kemungkinan besar lebih menyukai pustaka yang mirip RFC959.
  • The URLdan URLConnectionkelas hanya aliran terbuka untuk komunikasi. The Sun menawarkan perpustakaan dukungan tidak langsung untuk penataan respon server FTP baku ke Jawa lebih bermanfaat benda seperti String, File, RemoteFile, atau Calendar. Jadi kita harus menulis lebih banyak kode hanya untuk menulis data ke dalam file atau untuk mengeksploitasi daftar direktori.
  • Seperti yang dijelaskan di bagian 3.2.5 dari RFC1738, "Optimasi", URL FTP mengharuskan koneksi (kontrol) ditutup setelah setiap operasi. Ini boros dan tidak efisien untuk mentransfer banyak file kecil. Lebih lanjut, server FTP yang sangat terbatas dapat menganggap overhead komunikasi seperti serangan atau penyalahgunaan jaringan yang jahat dan menolak layanan lebih lanjut.
  • Akhirnya, ia kekurangan beberapa fitur yang berguna.

Untuk semua atau salah satu alasan ini, lebih disukai menggunakan pustaka pihak ketiga. Bagian berikut mencantumkan alternatif pihak ketiga yang tersedia.

Perbandingan perpustakaan

Daftar di bawah menguraikan perpustakaan yang saya bandingkan di seluruh artikel ini. Semuanya mengikuti spesifikasi referensi FTP. Di bawah ini, saya menyebutkan nama provider dan nama perpustakaannya (cetak miring). Sumber daya termasuk tautan ke setiap situs web produk. Untuk penggunaan pustaka jumpstart, saya juga menyebutkan kelas klien FTP utama.

  1. JScape, Pabrik iNet :com.jscape.inet.ftp.Ftp
  2. / n perangkat lunak, IP * Bekerja :ipworks.Ftp
  3. Teknologi Terdistribusi Perusahaan, Perpustakaan Klien FTP Java :com.enterprisedt.net.ftp.FTPClient
  4. IBM alphaWorks, FTP Bean Suite :com.ibm.network.ftp.protocol.FTPProtocol
  5. SourceForge, JFtp :net.sf.jftp.net.FtpConnection
  6. Proyek Jakarta, Jakarta Commons / Net :org.apache.commons.net.ftp.FTPClient
  7. JavaShop JNetBeans :jshop.jnet.FTPClient
  8. Minggu, JDK :sun.net.ftp.FtpClient
  9. Florent Cueto, JavaFTP API :com.cqs.ftp.FTP
  10. Bea Petrovicova, jFTP :cz.dhl.ftp.Ftp
  11. Proyek Globus, Java CoG Kit :org.globus.io.ftp.FTPClient

Catatan:

  • Pada saat penulisan ini, IBM sedang mengevaluasi kesesuaian penawaran alphaWorks FTP Bean Suite di Situsnya. Untuk saat ini, unduhan ditutup untuk semua pengguna.
  • Jakarta Commons / Net adalah pengganti untuk Savarese NetComponents, yang tidak lagi dikembangkan.
  • JavaShop JNetBeans tampaknya telah ditinggalkan. Pada saat penulisan ini, situs tersebut telah offline selama lebih dari sebulan, dan saya tidak pernah menerima jawaban apa pun atas permintaan dukungan saya.

Kriteria

Sejauh ini, saya telah memperkenalkan konteks dan membuat daftar pustaka yang tersedia. Sekarang, saya membuat daftar kriteria relevan yang akan dievaluasi oleh setiap perpustakaan. Saya menghitung nilai yang mungkin untuk setiap kriteria, bersama dengan singkatan ( dicetak tebal ) yang digunakan dalam matriks perbandingan akhir.

Dukungan produk

Perpustakaan memberikan dukungan kepada pengguna melalui dokumentasi produk, Javadocs yang dikompilasi, kode sampel, dan aplikasi contoh yang dapat menyertakan komentar dan penjelasan. Dukungan tambahan dapat ditawarkan kepada pengguna melalui forum, milis, alamat email kontak, atau sistem pelacakan bug online. / n software menawarkan dukungan ekstensif dengan biaya tambahan.

Motivasi administrator dukungan merupakan faktor penting untuk dukungan cepat. Administrator dukungan dapat berupa:

  • Seorang individu sukarela ( I )
  • Kelompok sukarela ( G )
  • Entitas profesional yang dibayar untuk memberikan dukungan ( P )

Lisensi

Untuk proyek komersial, lisensi produk merupakan hal yang penting untuk dipertimbangkan sejak awal. Beberapa perpustakaan dapat didistribusikan ulang secara bebas dalam produk komersial dan yang lainnya tidak. Misalnya, GPL (GNU General Public License) adalah lisensi yang kuat dan membatasi, sedangkan lisensi Perangkat Lunak Apache hanya perlu disebutkan dalam produk yang didistribusikan ulang.

Lisensi komersial membatasi jumlah pemrograman workstation pengembangan dengan perpustakaan, tetapi distribusi perpustakaan itu sendiri tidak dibatasi.

Untuk proyek non-komersial, lisensi lebih merupakan masalah filosofi; produk gratis cukup berarti.

Lisensi dapat berupa:

  • Komersial ( C )
  • GPL ( G )
  • Free (F); however, check a free license for limitations

Some library providers provide alternate, less-restrictive licenses on demand.

Source code provided

A closed-sourced, black-box software library can be irritating. Having source code can be more comfortable for the following reasons:

  • When debugging application code execution, stepping into the library code source can help you understand library behavior
  • The source code has useful comments
  • Source code can be quickly tweaked to match special needs
  • Exemplary source code can be inspiring

Age

Libraries have been tested, debugged, and supported since their first public release. As version numbering varies among libraries, I base this criterion on the year of the earliest public release.

Directory listing support

Retrieving remote file information (name, size, date) from the server is important in most applications. The FTP protocol offers the NLST command to retrieve the file names only; the NLST command is explicitly designed to be exploited by programs. The LIST command offers more file information; as RFC959 notes, "Since the information on a file may vary widely from system to system, this information may be hard to use automatically in a program, but may be quite useful to a human user." No other standard method retrieves file information; therefore, client libraries try to exploit the LIST response. But this is not an easy task: since no authoritative recommendation is available for the LIST response format, FTP servers have adopted various formats:

  • Unix style: drwxr-xr-x 1 user01 ftp 512 Jan 29 23:32 prog
  • Alternate Unix style: drwxr-xr-x 1 user01 ftp 512 Jan 29 1997 prog
  • Alternate Unix style: drwxr-xr-x 1 1 1 512 Jan 29 23:32 prog
  • A symbolic link in Unix style: lrwxr-xr-x 1 user01 ftp 512 Jan 29 23:32 prog -> prog2000
  • Weird Unix style (no space between user and group): drwxr-xr-x 1 usernameftp 512 Jan 29 23:32 prog
  • MS-DOS style: 01-29-97 11:32PM prog
  • Macintosh style: drwxr-xr-x folder 0 Jan 29 23:32 prog
  • OS/2 style: 0 DIR 01-29-97 23:32 PROG

Unix style, then MS-DOS style, are the most widespread formats.

Java FTP client libraries try to understand and auto-detect as many formats as possible. In addition, they offer various alternatives for handling unexpected format answers:

  • An additional method returning a raw FTP response as one string (S)
  • An additional method returning a collection of raw strings, one string per line/file (C)
  • A framework supporting pluggable parsers (P)

Most libraries parse LIST responses and structure raw file information into Java objects. For example, with JScape iNet Factory, the following code retrieves and exploits file information received in a directory listing:

java.util.Enumeration files = ftpClient.getDirListing(); while (files.hasMoreElements()) { FtpFile ftpFile = (FtpFile) files.nextElement(); System.out.println(ftpFile.getFilename()); System.out.println(ftpFile.getFilesize()); // etc. other helpful methods are detailed in Javadoc } 

Section "Solutions for Remaining Problems" further considers directory listings.

Timestamp retrieval

In many cases, we are interested in a remote file's latest modification timestamp. Unfortunately, no RFC introduces a standard FTP command to retrieve this information. Two de facto methods exist:

  1. Retrieve this information from the LIST response by parsing the server answer. Unfortunately, as you learned in the previous section, the LIST response varies among FTP servers, and the timestamp information is sometimes incomplete. In the Unix format, imprecision occurs when the remote file is more than one year old: only the date and year, but not hours or minutes are given.
  2. Use the nonstandard MDTM command, which specifically retrieves a remote file's last modification timestamp. Unfortunately, not all FTP servers implement this command.

An intricate alternative to MDTM command support is to send a raw MDTM command and parse the response. Most libraries provide a method for sending a raw FTP command, something like:

String timeStampString = ftpClient.command("MDTM README.txt"); 

Another possible concern is that FTP servers return time information in GMT (Greenwich Mean Time). If the server time zone is known apart from FTP communication, the java.util.TimeZone.getOffset() method can help adjust a date between time zones. See JDK documentation for further information about this method.

Section "Solutions for Remaining Problems" further considers file timestamp retrieval.

Firewalls

Typically, a firewall is placed between a private enterprise network and a public network such as the Internet. Access is managed from the private network to the public network, but access is denied from the public network to the private network.

Socks is a publicly available protocol developed for use as a firewall gateway for the Internet. The JDK supports Socks 4 and Socks 5 proxies, which can be controlled by some of the libraries. As an alternative, the JVM command line can set the Socks proxy parameters: java -DsocksProxyPort=1080 -DsocksProxyHost=socks.foo.com -Djava.net.socks.username=user01 -Djava.net.socks.password=pass1234 ...

Another common alternative to Socks proxy support is to "socksify" the underlying TCP/IP layer on the client machine. A product like Hummingbird can do that job.

The JDK also supports HTTP tunnels. These widespread proxies do not allow FTP uploads. /n software's IP*Works allows you to set HTTP tunnel parameters.

Kebanyakan perpustakaan mendukung koneksi aktif dan pasif: koneksi pasif berguna ketika klien berada di belakang firewall yang menghambat koneksi masuk ke port yang lebih tinggi. RFC1579 membahas fungsionalitas ramah firewall ini secara lebih rinci. Dokumentasi beberapa produk masing-masing mengacu pada koneksi aktif dan pasif sebagai PORTdan PASVperintah.

Transfer paralel

Dalam aplikasi desktop, saat transfer dimulai di utas tunggal utama, semuanya macet. Beberapa perpustakaan secara otomatis melayani loop acara untuk transfer paralel di utas terpisah sehingga kami tidak perlu membuat dan mengelola utas kami sendiri.

Dukungan spesifikasi JavaBean

Beberapa pustaka mengimplementasikan spesifikasi JavaBean. Kepatuhan JavaBean memungkinkan pemrograman visual, yang ditampilkan dalam IDE Java utama.