Perpustakaan pelanggan Java FTP disemak

Mari kita bayangkan situasi di mana kita ingin menulis aplikasi Java murni yang mesti memuat turun fail dari komputer jauh yang menjalankan pelayan FTP. Kami juga ingin menyaring muat turun berdasarkan maklumat fail jauh seperti nama, tarikh, atau ukuran.

Walaupun mungkin, dan mungkin menyenangkan, menulis pengendali protokol untuk FTP dari awal, melakukannya juga sukar, panjang, dan berpotensi berisiko. Oleh kerana kita lebih suka tidak menghabiskan masa, usaha, atau wang untuk menulis sendiri, kita lebih suka menggunakan semula komponen perisian yang ada. Dan banyak perpustakaan terdapat di World Wide Web. Dengan pustaka klien FTP, memuat turun fail boleh ditulis di 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 pelanggan Java FTP yang berkualiti yang sesuai dengan keperluan kita semudah itu; ia boleh menyakitkan. Ia memerlukan sedikit masa untuk mencari perpustakaan klien Java FTP. Kemudian, setelah kita menjumpai semua perpustakaan yang ada, mana yang kita pilih? Setiap perpustakaan memenuhi keperluan yang berbeza. Perpustakaan tidak berkualiti, dan reka bentuknya berbeza pada asasnya. Masing-masing menawarkan rangkaian ciri yang berbeza dan menggunakan pelbagai jenis jargon untuk menerangkannya.

Oleh itu, menilai dan membandingkan perpustakaan klien FTP dapat membuktikan sukar dan membingungkan. Menggunakan semula komponen yang ada adalah proses yang terpuji, tetapi dalam kes ini, memulakannya tidak menggalakkan. Dan ini memalukan: setelah memilih perpustakaan FTP yang baik, selebihnya adalah rutin.

Artikel ini bertujuan untuk menjadikan proses pemilihan itu pendek, mudah, dan bermanfaat. Saya mula-mula menyenaraikan semua perpustakaan pelanggan FTP yang ada. Kemudian saya menentukan dan menerangkan senarai kriteria yang relevan yang harus ditangani oleh perpustakaan. Akhirnya, saya membentangkan matriks gambaran keseluruhan yang memberikan gambaran ringkas bagaimana perpustakaan saling bertumpuk. Semua maklumat ini menyediakan semua yang kita perlukan untuk membuat keputusan yang pantas, boleh dipercayai, dan tahan lama.

Sokongan FTP di JDK

Spesifikasi rujukan untuk FTP adalah Request for Comments: 959 (RFC959). Sun Microsystems menyediakan implementasi RFC959 di JDK, tetapi bersifat dalaman, tidak berdokumen, dan tidak ada sumber yang disediakan. Walaupun RFC959 terletak dalam bayang-bayang, sebenarnya itu adalah hujung belakang antara muka awam yang menerapkan RFC1738, spesifikasi URL, seperti yang digambarkan dalam Gambar 1.

Pelaksanaan RFC1738 ditawarkan sebagai standard dalam JDK. Ia melakukan pekerjaan yang wajar untuk operasi pemindahan FTP asas. Itu umum dan didokumentasikan, dan kod sumber disediakan. Untuk menggunakannya, kami menulis perkara berikut:

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

Sokongan pelanggan FTP di JDK dengan tegas mengikuti cadangan standard, tetapi mempunyai beberapa kelemahan:

  • Ini pada asasnya berbeza dari perpustakaan pelanggan FTP pihak ketiga; ini melaksanakan RFC959 dan bukannya RFC1738.
  • RFC959 dilaksanakan di kebanyakan alat klien FTP desktop. Banyak pengaturcara Java menggunakan alat ini untuk menyambung ke pelayan FTP. Sebagai soal selera, alat ini kemungkinan besar lebih suka perpustakaan seperti RFC959.
  • Yang URLdan URLConnectionkelas hanya aliran terbuka untuk komunikasi. Matahari perpustakaan tawaran sokongan tidak lurus untuk penstrukturan balas pelayan FTP mentah ke dalam Java lebih mudah untuk digunakan objek seperti String, File, RemoteFile, atau Calendar. Oleh itu, kita harus menulis lebih banyak kod hanya untuk menulis data ke dalam fail atau untuk memanfaatkan senarai direktori.
  • Seperti yang dijelaskan di bahagian 3.2.5 dari RFC1738, "Pengoptimuman," URL FTP menghendaki agar sambungan (kawalan) ditutup setelah setiap operasi. Ini membazir dan tidak cekap untuk memindahkan banyak fail kecil. Lebih jauh lagi, pelayan FTP yang sangat ketat mungkin menganggap komunikasi komunikasi itu sebagai serangan atau penyalahgunaan rangkaian jahat dan menolak perkhidmatan lebih lanjut.
  • Akhirnya, ia kekurangan beberapa ciri berguna.

Untuk semua atau sebab-sebab ini, penggunaan perpustakaan pihak ketiga adalah lebih baik. Bahagian berikut menyenaraikan alternatif pihak ketiga yang ada.

Perbandingan perpustakaan

Senarai di bawah menggariskan perpustakaan yang saya bandingkan sepanjang artikel ini. Mereka semua mengikut spesifikasi FTP rujukan. Di bawah ini, saya menyebut nama penyedia dan nama perpustakaan (dalam huruf miring). Sumber merangkumi pautan ke setiap Laman web produk. Untuk melancarkan penggunaan perpustakaan, saya juga menyebut kelas pelanggan FTP utama.

  1. JScape, Kilang iNet :com.jscape.inet.ftp.Ftp
  2. / n perisian, IP * Berfungsi :ipworks.Ftp
  3. Enterprise Distributed Technologies, Perpustakaan Pelanggan Java FTP :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. Projek Jakarta, Jakarta Commons / Net :org.apache.commons.net.ftp.FTPClient
  7. JavaShop JNetBeans :jshop.jnet.FTPClient
  8. Matahari, JDK :sun.net.ftp.FtpClient
  9. Florent Cueto, JavaFTP API :com.cqs.ftp.FTP
  10. Bea Petrovicova, jFTP :cz.dhl.ftp.Ftp
  11. Projek Globus, Kit CoG Java :org.globus.io.ftp.FTPClient

Catatan:

  • Pada masa penulisan ini, IBM sedang menilai kesesuaian untuk menawarkan alphaWorks FTP Bean Suite di laman webnya. Buat masa ini, muat turun ditutup untuk semua pengguna.
  • Jakarta Commons / Net adalah pengganti drop-in untuk Savarese NetComponents, yang tidak lagi dikembangkan.
  • JavaShop JNetBeans nampaknya telah ditinggalkan. Pada masa penulisan ini, laman web ini sudah tidak beroperasi lebih dari sebulan, dan saya tidak pernah mendapat jawapan atas permintaan sokongan saya.

Kriteria

Setakat ini, saya telah memperkenalkan konteks dan menyenaraikan perpustakaan yang ada. Sekarang, saya senaraikan kriteria yang relevan di mana setiap perpustakaan akan dinilai. Saya menghitung nilai yang mungkin untuk setiap kriteria, bersama dengan singkatan (dalam huruf tebal ) yang digunakan dalam matriks perbandingan akhir.

Sokongan produk

Perpustakaan memberikan sokongan kepada pengguna melalui dokumentasi produk, menyusun Javadocs, contoh kod, dan aplikasi contoh yang dapat menyertakan komen dan penjelasan. Sokongan tambahan dapat ditawarkan kepada pengguna melalui forum, daftar surat, alamat e-mel kontak, atau sistem pelacakan bug dalam talian. / n perisian menawarkan sokongan yang luas dengan bayaran tambahan.

Motivasi pentadbir sokongan adalah faktor penting untuk sokongan pantas. Pentadbir sokongan boleh:

  • Individu sukarela ( I )
  • Kumpulan sukarela ( G )
  • Entiti profesional yang dibayar untuk memberi sokongan ( P )

Lesen

Untuk projek komersial, lesen produk adalah perkara penting yang harus dipertimbangkan sejak awal. Beberapa perpustakaan dapat diedarkan secara bebas dalam produk komersial dan yang lain tidak dapat. Sebagai contoh, GPL (GNU General Public License) adalah lesen terhad yang kuat, sementara lesen Perisian Apache hanya memerlukan sebutan dalam produk yang diedarkan semula.

Lesen komersial membatasi jumlah pengaturcaraan stesen kerja pembangunan dengan perpustakaan, tetapi pengedaran perpustakaan itu sendiri tidak terhad.

Untuk projek bukan komersial, lesen lebih kepada falsafah; produk percuma semestinya.

Lesen boleh:

  • 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.

Sebilangan besar perpustakaan menyokong sambungan aktif dan pasif: sambungan pasif berguna apabila klien berada di belakang firewall yang menghalang sambungan masuk ke port yang lebih tinggi. RFC1579 membincangkan fungsi mesra firewall ini dengan lebih terperinci. Beberapa dokumentasi produk masing-masing merujuk kepada sambungan aktif dan pasif sebagai PORTdan PASVperintah.

Pemindahan selari

Dalam aplikasi desktop, apabila pemindahan bermula di utas tunggal utama, semuanya membeku. Sebilangan perpustakaan secara automatik menyediakan gelung peristiwa untuk pemindahan selari dalam urutan yang berasingan, jadi kami tidak perlu membuat dan menguruskan utas kami sendiri.

Sokongan spesifikasi JavaBean

Beberapa perpustakaan menerapkan spesifikasi JavaBean. Pematuhan JavaBean memungkinkan pengaturcaraan visual, yang ditampilkan dalam IDE Java utama.