Bibliothèques client FTP Java examinées

Imaginons une situation où nous voulons écrire une application Java pure qui doit télécharger des fichiers à partir d'un ordinateur distant exécutant un serveur FTP. Nous souhaitons également filtrer les téléchargements en fonction des informations de fichier distant telles que le nom, la date ou la taille.

Bien qu'il soit possible, et peut-être amusant, d'écrire un gestionnaire de protocole pour FTP à partir de zéro, le faire est également difficile, long et potentiellement risqué. Puisque nous préférons ne pas passer le temps, les efforts ou l'argent à écrire seuls un gestionnaire, nous préférons plutôt réutiliser un composant logiciel existant. Et de nombreuses bibliothèques sont disponibles sur le World Wide Web. Avec une bibliothèque client FTP, le téléchargement d'un fichier peut être écrit en Java aussi simplement que:

FTPClient ftpClient = nouveau FTPClient (); ftpClient.connect ("ftp.foo.com", "user01", "pass1234"); ftpClient.download ("C: \\ Temp \\", "README.txt"); // Finalement, d'autres opérations ici ... ftpClient.disconnect ();

La recherche d'une bibliothèque client FTP Java de qualité qui correspond à nos besoins n'est pas aussi simple qu'il y paraît; cela peut être assez douloureux. Il faut un certain temps pour trouver une bibliothèque client FTP Java. Ensuite, après avoir trouvé toutes les bibliothèques existantes, laquelle sélectionnons-nous? Chaque bibliothèque répond à des besoins différents. Les bibliothèques sont de qualité inégale et leurs conceptions diffèrent fondamentalement. Chacun offre un ensemble différent de fonctionnalités et utilise différents types de jargon pour les décrire.

Ainsi, l'évaluation et la comparaison des bibliothèques clientes FTP peuvent s'avérer difficiles et déroutantes. La réutilisation des composants existants est un processus louable, mais dans ce cas, le démarrage peut être décourageant. Et c'est dommage: après avoir choisi une bonne bibliothèque FTP, le reste est de la routine.

Cet article vise à rendre ce processus de sélection court, facile et utile. Je liste d'abord toutes les bibliothèques client FTP disponibles. Ensuite, je définis et décris une liste de critères pertinents que les bibliothèques devraient aborder d'une manière ou d'une autre. Enfin, je présente une matrice de présentation qui donne un aperçu rapide de la façon dont les bibliothèques se comparent. Toutes ces informations fournissent tout ce dont nous avons besoin pour prendre une décision rapide, fiable et durable.

Prise en charge FTP dans JDK

La spécification de référence pour FTP est Request for Comments: 959 (RFC959). Sun Microsystems fournit une implémentation RFC959 dans le JDK, mais elle est interne, non documentée et aucune source n'est fournie. Alors que RFC959 se trouve dans l'ombre, c'est en fait le back-end d'une interface publique implémentant RFC1738, la spécification d'URL, comme illustré dans la Figure 1.

Une implémentation de RFC1738 est proposée en standard dans le JDK. Il fait un travail raisonnable pour les opérations de transfert FTP de base. Il est public et documenté, et le code source est fourni. Pour l'utiliser, nous écrivons ce qui suit:

URL url = nouvelle URL ("ftp: // utilisateur01: [email protected]/README.txt; type = i"); URLConnection urlc = url.openConnection (); InputStream est = urlc.getInputStream (); // Pour télécharger OutputStream os = urlc.getOutputStream (); // Télécharger

La prise en charge du client FTP dans JDK suit strictement la recommandation standard, mais elle présente plusieurs inconvénients:

  • Il diffère fondamentalement des bibliothèques clientes FTP tierces; ceux-ci implémentent RFC959 plutôt que RFC1738.
  • La RFC959 est implémentée dans la plupart des outils client FTP de bureau. De nombreux programmeurs Java utilisent ces outils pour se connecter à des serveurs FTP. Par goût, ces outils préfèrent probablement les bibliothèques de type RFC959.
  • Les classes URLet URLConnectionn'ouvrent que les flux pour la communication. Le soutien bibliothèque offre Sun pas directement pour structurer les réponses du serveur FTP brutes en Java plus facile à utiliser des objets comme String, File, RemoteFileou Calendar. Nous devons donc écrire plus de code juste pour écrire des données dans un fichier ou pour exploiter un listing de répertoire.
  • Comme expliqué dans la section 3.2.5 de la RFC1738, «Optimisation», les URL FTP exigent que la connexion (de contrôle) se ferme après chaque opération. Ceci est inutile et peu efficace pour transférer de nombreux petits fichiers. En outre, les serveurs FTP extrêmement restrictifs peuvent considérer une telle surcharge de communication comme une attaque ou un abus réseau malveillant et refuser un service supplémentaire.
  • Enfin, il lui manque plusieurs fonctionnalités utiles.

Pour tout ou partie de ces raisons, l'utilisation d'une bibliothèque tierce est préférable. La section suivante répertorie les alternatives tierces disponibles.

Comparaison de la bibliothèque

La liste ci-dessous présente les bibliothèques que je compare tout au long de cet article. Ils suivent tous la spécification FTP de référence. Ci-dessous, je mentionne le nom du fournisseur et le nom de la bibliothèque (en italique). Les ressources comprennent des liens vers chaque site Web de produit. Pour relancer l'utilisation de la bibliothèque, je mentionne également la classe de client FTP principale.

  1. JScape, usine iNet :com.jscape.inet.ftp.Ftp
  2. / n logiciel, IP * fonctionne :ipworks.Ftp
  3. Technologies distribuées d'entreprise, bibliothèque client 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. Le projet de Jakarta, Jakarta Commons / Net :org.apache.commons.net.ftp.FTPClient
  7. JavaShop JNetBeans :jshop.jnet.FTPClient
  8. Soleil, JDK :sun.net.ftp.FtpClient
  9. Florent Cueto, API JavaFTP :com.cqs.ftp.FTP
  10. Bea Petrovicova, jFTP :cz.dhl.ftp.Ftp
  11. Le projet Globus, kit Java CoG :org.globus.io.ftp.FTPClient

Remarques:

  • Au moment d'écrire ces lignes, IBM évalue la pertinence de proposer sa suite alphaWorks FTP Bean sur son site Web. Pour l'instant, le téléchargement est fermé pour tous les utilisateurs.
  • Jakarta Commons / Net est un remplacement de Savarese NetComponents, qui n'est plus développé.
  • JavaShop JNetBeans semble avoir été abandonné. Au moment d'écrire ces lignes, le site est hors ligne depuis plus d'un mois et je n'ai jamais reçu de réponse à mes demandes d'assistance.

Critères

So far, I have introduced the context and listed the available libraries. Now, I list the relevant criteria against which each library will be evaluated. I enumerate possible values for each criterion, along with the abbreviation (in bold) used in the final comparison matrix.

Product support

The libraries provide support to users through product documentation, compiled Javadocs, sample code, and an example application that can include comments and explanations. Additional support can be offered to users through forums, mailing lists, a contact email address, or an online bug tracking system. /n software offers extensive support for an additional fee.

A support administrator's motivation is an important factor for fast support. Support administrators can be:

  • A voluntary individual (I)
  • Un groupe bénévole ( G )
  • Une entité professionnelle rémunérée pour fournir un accompagnement ( P )

Licence

Pour les projets commerciaux, une licence de produit est une question importante à considérer dès le début. Certaines bibliothèques peuvent être librement redistribuées dans des produits commerciaux et d'autres non. Par exemple, GPL (GNU General Public License) est une licence forte et limitative, tandis que la licence du logiciel Apache ne nécessite qu'une mention dans les produits redistribués.

Les licences commerciales limitent le nombre de postes de travail de développement programmant avec la bibliothèque, mais la distribution de la bibliothèque elle-même n'est pas limitée.

Pour les projets non commerciaux, la licence est plus une question de philosophie; un produit gratuit est appréciable.

Les licences peuvent être:

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

La plupart des bibliothèques prennent en charge les connexions actives et passives: la connexion passive est utile lorsque le client se trouve derrière un pare-feu qui empêche les connexions entrantes aux ports supérieurs. La RFC1579 décrit cette fonctionnalité compatible avec les pare-feu plus en détail. Les documentations de certains produits font référence aux connexions actives et passives en tant PORTque PASVcommandes et , respectivement.

Transfert parallèle

Dans une application de bureau, lorsqu'un transfert démarre dans le thread unique principal, tout se fige. Certaines bibliothèques desservent automatiquement la boucle d'événements pour les transferts parallèles dans des threads séparés afin que nous n'ayons pas à créer et gérer nos propres threads.

Prise en charge des spécifications JavaBean

Certaines bibliothèques implémentent la spécification JavaBean. La conformité JavaBean permet la programmation visuelle, qui est présentée dans les principaux IDE Java.