Pregledane knjižnice Java FTP klijenta

Zamislimo situaciju u kojoj želimo napisati čisti Java program koji mora preuzimati datoteke s udaljenog računala na kojem je pokrenut FTP poslužitelj. Također želimo filtrirati preuzimanja na temelju podataka o udaljenim datotekama poput imena, datuma ili veličine.

Iako je moguće i možda zabavno napisati obrađivač protokola za FTP ispočetka, to je također teško, dugo i potencijalno rizično. Budući da radije ne bismo trošili vrijeme, trud ili novac na samostalno pisanje rukovatelja, radije umjesto ponovne upotrebe postojeće softverske komponente. I mnoštvo knjižnica dostupno je na World Wide Webu. S knjižnicom FTP klijenta preuzimanje datoteke može se napisati na Javi jednostavno:

FTPClient ftpClient = novi FTPClient (); ftpClient.connect ("ftp.foo.com", "user01", "pass1234"); ftpClient.download ("C: \\ Temp \\", "README.txt"); // Eventualno ostale operacije ovdje ... ftpClient.disconnect ();

Traženje kvalitetne knjižnice Java FTP klijenta koja odgovara našim potrebama nije tako jednostavno kao što se čini; može biti prilično bolno. Potrebno je neko vrijeme za pronalaženje knjižnice Java FTP klijenta. Zatim, nakon što pronađemo sve postojeće knjižnice, koju ćemo odabrati? Svaka knjižnica rješava različite potrebe. Knjižnice su nejednake kvalitete i njihov se dizajn bitno razlikuje. Svaka nudi drugačiji skup značajki i koristi ih različitim vrstama žargona kako bi ih opisala.

Stoga se procjena i usporedba knjižnica FTP klijenta može pokazati teškim i zbunjujućim. Ponovna upotreba postojećih komponenti hvalevrijedan je postupak, ali u ovom slučaju pokretanje može biti obeshrabrujuće. I ovo je šteta: nakon odabira dobre FTP biblioteke, ostalo je rutina.

Ovim se člankom želi taj postupak odabira učiniti kratkim, laganim i vrijednim. Prvo popisujem sve dostupne knjižnice FTP klijenta. Tada definiram i opisujem popis relevantnih kriterija kojima bi se knjižnice trebale baviti na neki način. Na kraju, predstavljam preglednu matricu koja daje brzi prikaz kako se knjižnice slažu jedna protiv druge. Sve ove informacije pružaju sve što nam je potrebno za brzu, pouzdanu i dugotrajnu odluku.

FTP podrška u JDK

Referentna specifikacija za FTP je Zahtjev za komentare: 959 (RFC959). Sun Microsystems pruža RFC959 implementaciju u JDK, ali je interna, nedokumentirana i nije naveden nikakav izvor. Iako RFC959 leži u sjeni, to je zapravo stražnji kraj javnog sučelja koji implementira RFC1738, specifikaciju URL-a, kao što je prikazano na slici 1.

Implementacija RFC1738 nudi se kao standard u JDK. Radi razuman posao za osnovne FTP operacije prijenosa. Javan je i dokumentiran, a pruža se i izvorni kod. Da bismo ga koristili, napišemo sljedeće:

URL url = novi URL ("ftp: // user01: [email protected]/README.txt; type = i"); URLConnection urlc = url.openConnection (); InputStream je = urlc.getInputStream (); // Za preuzimanje OutputStream os = urlc.getOutputStream (); // Za prijenos

Podrška za FTP klijenta u JDK strogo slijedi standardne preporuke, ali ima nekoliko nedostataka:

  • Iz temelja se razlikuje od knjižnica FTP klijenata treće strane; oni implementiraju RFC959, a ne RFC1738.
  • RFC959 implementiran je u većinu alata za FTP klijente na radnoj površini. Mnogi programeri Java koriste se tim alatima za povezivanje s FTP poslužiteljima. Što se tiče ukusa, ovi alati najvjerojatnije preferiraju knjižnice slične RFC959.
  • Predavanja URLi URLConnectionnude samo otvorene tokove za komunikaciju. Sunce knjižnica daje nikakav ravno podrška za strukturiranje sirovi FTP poslužitelja odgovori u više iskoristive Java objekata kao što su String, File, RemoteFileili Calendar. Stoga moramo napisati više koda samo da bismo zapisali podatke u datoteku ili iskoristili popis direktorija.
  • Kao što je objašnjeno u odjeljku 3.2.5 RFC1738, "Optimizacija", FTP URL-ovi zahtijevaju zatvaranje (kontrolne) veze nakon svake operacije. Ovo je rastrošno i nije učinkovito za prijenos mnogih malih datoteka. Nadalje, krajnje restriktivni FTP poslužitelji takvu komunikacijsku potrošnju mogu smatrati zlim mrežnim napadom ili zlouporabom i uskratiti daljnju uslugu.
  • Napokon, nedostaje mu nekoliko korisnih značajki.

Iz svih ili bilo kojeg od ovih razloga poželjno je koristiti biblioteku treće strane. Sljedeći odjeljak navodi dostupne alternative trećih strana.

Usporedba knjižnica

Popis u nastavku daje pregled knjižnica koje uspoređujem kroz ovaj članak. Svi slijede referentnu FTP specifikaciju. Ispod spominjem ime davatelja i naziv knjižnice (u kurzivu). Resursi uključuju veze do web mjesta svakog proizvoda. Da bih ubrzao korištenje knjižnice, također spominjem glavnu klasu FTP klijenta.

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

Bilješke:

  • U vrijeme pisanja ovog članka, IBM procjenjuje prikladnost ponude svog alphaWorks FTP Bean Suitea na svojoj web stranici. Za sada je preuzimanje zatvoreno za sve korisnike.
  • Jakarta Commons / Net zamjena je za Savarese NetComponents, koja više nije razvijena.
  • Čini se da je JavaShop JNetBeans napušten. U vrijeme pisanja ovog članka, web lokacija je bila izvan mreže više od mjesec dana i nikad nisam dobio odgovore na svoje zahtjeve za podršku.

Kriteriji

Do sada sam uveo kontekst i nabrojao dostupne knjižnice. Sad navodim relevantne kriterije prema kojima će se ocjenjivati ​​svaka knjižnica. Nabrajam moguće vrijednosti za svaki kriterij, zajedno sa kraticom ( podebljano ) koja se koristi u konačnoj matrici usporedbe.

Podrška proizvoda

Knjižnice pružaju podršku korisnicima putem dokumentacije o proizvodu, kompajliranog Javadocs-a, uzorka koda i primjera aplikacije koja može sadržavati komentare i objašnjenja. Dodatna podrška može se ponuditi korisnicima putem foruma, mailing lista, kontakt adrese e-pošte ili mrežnog sustava za praćenje grešaka. / n softver nudi opsežnu podršku uz dodatnu naknadu.

Motivacija administratora podrške važan je čimbenik brze podrške. Administratori podrške mogu biti:

  • Dobrovoljni pojedinac ( I )
  • Dobrovoljna skupina ( G )
  • Stručni subjekt plaćen za pružanje potpore ( P )

Licenca

Za komercijalne projekte važna je stvar koju treba razmotriti od početka. Neke se knjižnice mogu slobodno distribuirati u komercijalne proizvode, a druge ne. Na primjer, GPL (GNU General Public License) snažna je, ograničavajuća licenca, dok licenca softvera Apache zahtijeva samo spominjanje u preraspodijeljenim proizvodima.

Komercijalne licence ograničavaju broj programiranja razvojnih radnih stanica s knjižnicom, ali distribucija same knjižnice nije ograničena.

Za nekomercijalne projekte licenca je više stvar filozofije; primjetan je besplatan proizvod.

Licence mogu biti:

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

Većina knjižnica podržava i aktivne i pasivne veze: pasivna veza korisna je kada je klijent iza vatrozida koji inhibira dolazne veze na više portove. RFC1579 detaljnije razmatra ovu funkcionalnost prilagođenu vatrozidu. Dokumentacija nekih proizvoda odnosi se na aktivne i pasivne veze kao PORTi na PASVnaredbe.

Paralelni prijenos

U stolnoj aplikaciji, kada prijenos započne u glavnoj pojedinačnoj niti, sve se zamrzne. Neke knjižnice automatski servisiraju petlju događaja za paralelne prijenose u zasebnim nitima, tako da ne moramo stvarati i upravljati vlastitim nitima.

Podrška za JavaBean specifikaciju

Neke knjižnice implementiraju JavaBean specifikaciju. Sukladnost s JavaBeanom omogućuje vizualno programiranje, koje se nalazi u glavnim Java IDE-ima.