Programování

Klientské knihovny Java FTP byly zkontrolovány

Představme si situaci, kdy chceme napsat čistou aplikaci Java, která musí stahovat soubory ze vzdáleného počítače se spuštěným serverem FTP. Chceme také filtrovat stahování na základě informací o vzdáleném souboru, jako je název, datum nebo velikost.

I když je možné a možná zábavné psát obslužný program protokolu pro FTP od nuly, je to také těžké, dlouhé a potenciálně riskantní. Protože bychom raději neměli trávit čas, úsilí nebo peníze psaním psovodů sami, raději místo toho znovu použijeme existující softwarovou komponentu. A spousta knihoven je k dispozici v síti WWW. S klientskou knihovnou FTP lze stahování souboru v Javě zapsat jednoduše jako:

FTPClient ftpClient = nový FTPClient (); ftpClient.connect ("ftp.foo.com", "user01", "pass1234"); ftpClient.download ("C: \ Temp \", "README.txt"); // Případně další operace zde ... ftpClient.disconnect (); 

Hledání kvalitní klientské knihovny Java FTP, která odpovídá našim potřebám, není tak jednoduché, jak se zdá; může to být docela bolestivé. Hledání klientské knihovny Java FTP trvá nějakou dobu. Poté, co najdeme všechny existující knihovny, kterou vybereme? Každá knihovna řeší různé potřeby. Knihovny mají nestejnou kvalitu a jejich design se zásadně liší. Každá nabízí jinou sadu funkcí a k jejich popisu používá různé typy žargonu.

Hodnocení a porovnávání klientských knihoven FTP se tedy může ukázat jako obtížné a matoucí. Opětovné použití stávajících komponent je chvályhodný proces, ale v tomto případě může být startování odrazující. A to je škoda: po výběru dobré knihovny FTP je zbytek rutina.

Tento článek si klade za cíl učinit tento výběrový proces krátkým, snadným a hodnotným. Nejprve uvedu seznam všech dostupných klientských knihoven FTP. Poté definuji a popíšu seznam relevantních kritérií, kterými by se knihovny měly nějakým způsobem zabývat. Nakonec představím přehledovou matici, která poskytuje rychlý přehled o tom, jak se knihovny skládají proti sobě. Všechny tyto informace poskytují vše, co potřebujeme pro rychlé, spolehlivé a dlouhodobé rozhodnutí.

Podpora FTP v JDK

Referenční specifikací pro FTP je Žádost o komentář: 959 (RFC959). Sun Microsystems poskytuje implementaci RFC959 v JDK, ale je interní, nezdokumentováno a není poskytován žádný zdroj. Zatímco RFC959 leží ve stínech, je to vlastně zadní část veřejného rozhraní implementujícího RFC1738, specifikaci URL, jak je znázorněno na obrázku 1.

Implementace RFC1738 je standardně nabízena v JDK. Provádí rozumnou práci pro základní operace přenosu FTP. Je veřejný a dokumentovaný a je poskytován zdrojový kód. Chcete-li jej použít, napíšeme následující:

URL url = nová URL ("ftp: // user01: [email protected]/README.txt; type = i"); URLConnection urlc = url.openConnection (); InputStream je = urlc.getInputStream (); // Stažení OutputStream os = urlc.getOutputStream (); // Nahrát 

Podpora klientů FTP v JDK přísně dodržuje standardní doporučení, ale má několik nevýhod:

  • Zásadně se liší od klientských knihoven FTP třetích stran; tyto implementují spíše RFC959 než RFC1738.
  • RFC959 je implementován ve většině desktopových nástrojů FTP klienta. Mnoho programátorů Java používá tyto nástroje k připojení k serverům FTP. Jako nástroj vkusu tyto nástroje s největší pravděpodobností preferují knihovny podobné RFC959.
  • The URL a URLConnection třídy pouze otevírají streamy pro komunikaci. Knihovna Sun nenabízí přímou podporu pro strukturování odpovědí surového FTP serveru do více použitelných objektů Java, jako je Tětiva, Soubor, RemoteFilenebo Kalendář. Musíme tedy napsat více kódu, abychom mohli zapsat data do souboru nebo využít výpis adresáře.
  • Jak je vysvětleno v části 3.2.5 dokumentu RFC1738 „Optimalizace“, adresy URL FTP vyžadují, aby se (ovládací) připojení po každé operaci zavřelo. To je plýtvání a není efektivní pro přenos mnoha malých souborů. Mimořádně restriktivní servery FTP mohou navíc považovat takovou režii komunikace za zlý síťový útok nebo zneužití a odepřít další službu.
  • Nakonec postrádá několik užitečných funkcí.

Ze všech nebo z kteréhokoli z těchto důvodů je vhodnější použít knihovnu jiného výrobce. V následující části jsou uvedeny dostupné alternativy třetích stran.

Porovnání knihoven

Níže uvedený seznam uvádí knihovny, které v tomto článku porovnávám. Všichni dodržují referenční specifikaci FTP. Níže uvádím název poskytovatele a název knihovny (kurzívou). Zdroje obsahují odkazy na webové stránky jednotlivých produktů. Pro použití knihovny jumpstart zmíním také hlavní třídu FTP klientů.

  1. JScape, iNet Factory: com.jscape.inet.ftp.Ftp
  2. / n software, IP * funguje: ipworks.Ftp
  3. Enterprise Distributed Technologies, Knihovna klientů Java FTP: com.entericatedt.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 v Jakartě, Jakarta Commons / Net: org.apache.commons.net.ftp.FTPClient
  7. JavaShop JNetBeans: jshop.jnet.FTPClient
  8. Slunce, JDK: sun.net.ftp.FtpClient
  9. Florent Cueto, JavaFTP API: com.cqs.ftp.FTP
  10. Bea Petrovičová, jFTP: cz.dhl.ftp.Ftp
  11. Projekt Globus, Sada Java CoG: org.globus.io.ftp.FTPClient

Poznámky:

  • V době psaní tohoto článku IBM vyhodnocuje vhodnost nabídky své sady alphaWorks FTP Bean Suite na svých webových stránkách. Prozatím je stahování pro všechny uživatele uzavřeno.
  • Jakarta Commons / Net je náhrada za náhradu za Savarese NetComponents, která již není vyvíjena.
  • Zdá se, že JavaShop JNetBeans byl opuštěn. V době psaní tohoto článku byl web offline více než měsíc a nikdy jsem neobdržel žádné odpovědi na mé žádosti o podporu.

Kritéria

Zatím jsem představil kontext a uvedl seznam dostupných knihoven. Nyní uvádíme seznam příslušných kritérií, podle nichž bude každá knihovna hodnocena. Vyjmenovávám možné hodnoty pro každé kritérium spolu se zkratkou (v tučně) použitý v konečné srovnávací matici.

Podpora produktů

Knihovny poskytují podporu uživatelům prostřednictvím produktové dokumentace, kompilovaného Javadocs, ukázkového kódu a ukázkové aplikace, která může obsahovat komentáře a vysvětlení. Další podporu lze uživatelům nabídnout prostřednictvím fór, e-mailových konferencí, kontaktní e-mailové adresy nebo online systému sledování chyb. / n software nabízí rozsáhlou podporu za příplatek.

Motivace správce podpory je důležitým faktorem pro rychlou podporu. Správci podpory mohou být:

  • Dobrovolník ()
  • Dobrovolná skupina (G)
  • Profesní subjekt placený za poskytování podpory (P)

Licence

U komerčních projektů je produktová licence od začátku důležitá věc, kterou je třeba vzít v úvahu. Některé knihovny lze volně distribuovat v komerčních produktech a jiné nikoli. Například GPL (GNU General Public License) je silná omezující licence, zatímco licence Apache Software vyžaduje zmínku pouze v redistribuovaných produktech.

Komerční licence omezují počet programování vývojových pracovních stanic s knihovnou, ale distribuce samotné knihovny není omezena.

U nekomerčních projektů je licence spíše otázkou filozofie; produkt zdarma je znatelný.

Licence mohou být:

  • Komerční (C)
  • GPL (G)
  • Volný, uvolnit (F); omezení si však ověřte u bezplatné licence

Někteří poskytovatelé knihoven poskytují alternativní, méně omezující licence na vyžádání.

Poskytnutý zdrojový kód

Softwarová knihovna černé skříňky s uzavřeným zdrojem může být dráždivá. Mít zdrojový kód může být pohodlnější z následujících důvodů:

  • Při ladění provádění kódu aplikace vám krokování do zdroje kódu knihovny pomůže pochopit chování knihovny
  • Zdrojový kód obsahuje užitečné komentáře
  • Zdrojový kód lze rychle vyladit tak, aby odpovídal zvláštním potřebám
  • Příkladný zdrojový kód může být inspirativní

Stáří

Knihovny byly testovány, laděny a podporovány od jejich prvního veřejného vydání. Jelikož se číslování verzí mezi knihovnami liší, zakládám toto kritérium na roce nejbližšího veřejného vydání.

Podpora výpisu adresářů

Načítání informací o vzdáleném souboru (název, velikost, datum) ze serveru je důležité ve většině aplikací. Protokol FTP nabízí NLST příkaz k načtení pouze názvů souborů; the NLST příkaz je výslovně navržen tak, aby byl využíván programy. The SEZNAM příkaz nabízí více informací o souboru; jak uvádí RFC959: „Vzhledem k tomu, že se informace o souboru mohou v různých systémech značně lišit, může být obtížné tyto informace automaticky použít v programu, ale mohou být docela užitečné pro lidského uživatele.“ Žádná jiná standardní metoda nenačte informace o souboru; proto se klientské knihovny snaží využít SEZNAM Odezva. Není to však snadný úkol: protože pro agenturu není k dispozici žádné autoritativní doporučení SEZNAM formát odpovědi, servery FTP přijaly různé formáty:

  • Unixový styl: drwxr-xr-x 1 uživatel01 ftp 512 29. ledna 23:32 prog
  • Alternativní styl Unixu: drwxr-xr-x 1 uživatel01 ftp 512 29. ledna 1997 prog
  • Alternativní styl Unixu: drwxr-xr-x 1 1 1512 29. ledna 23:32 prog
  • Symbolický odkaz ve stylu Unixu: lrwxr-xr-x 1 uživatel01 ftp 512 29. ledna 23:32 prog -> prog2000
  • Divný unixový styl (žádný prostor mezi uživatelem a skupinou): drwxr-xr-x 1 usernameftp 512 29. ledna 23:32 prog
  • MS-DOS styl: 01-29-97 23:32 prog
  • Styl Macintosh: složka drwxr-xr-x 0 29. ledna 23:32 prog
  • Styl OS / 2: 0 DIR 01-29-97 23:32 PROG

Unixový styl, pak MS-DOS styl, jsou nejrozšířenější formáty.

Klientské knihovny Java FTP se snaží pochopit a automaticky detekovat co nejvíce formátů. Kromě toho nabízejí různé alternativy pro zpracování neočekávaných odpovědí na formát:

  • Další metoda vracející nezpracovanou odpověď FTP jako jeden řetězec (S)
  • Další metoda vracející kolekci nezpracovaných řetězců, jeden řetězec na řádek / soubor (C)
  • Rámec podporující připojitelné analyzátory (P)

Většina knihoven analyzuje SEZNAM odpovědi a strukturujte surové informace o souboru do objektů Java. Například s JScape iNet Factory následující kód načte a využije informace o souboru přijaté v seznamu adresářů:

java.util.Enumeration files = ftpClient.getDirListing (); while (files.hasMoreElements ()) {FtpFile ftpFile = (FtpFile) files.nextElement (); System.out.println (ftpFile.getFilename ()); System.out.println (ftpFile.getFilesize ()); // atd. další užitečné metody jsou podrobně popsány v Javadocu} 

Sekce „Řešení zbývajících problémů“ dále uvažuje výpisy adresářů.

Načtení časového razítka

V mnoha případech nás zajímá časová značka poslední úpravy vzdáleného souboru. Bohužel žádná RFC nezavádí standardní příkaz FTP k načtení těchto informací. Existují dvě de facto metody:

  1. Načíst tyto informace z SEZNAM odpověď analýzou odpovědi serveru. Bohužel, jak jste se dozvěděli v předchozí části, SEZNAM odpověď se mezi servery FTP liší a informace o časovém razítku jsou někdy neúplné. Ve formátu Unix dochází k nepřesnostem, pokud je vzdálený soubor starší než jeden rok: je uvedeno pouze datum a rok, ale nejsou uvedeny hodiny ani minuty.
  2. Použijte nestandardní MDTM příkaz, který konkrétně načte časovou značku poslední úpravy vzdáleného souboru. Bohužel ne všechny servery FTP implementují tento příkaz.

Složitá alternativa k MDTM podpora příkazu je poslat raw MDTM příkaz a analyzovat odpověď. Většina knihoven poskytuje metodu pro odeslání surového příkazu FTP, něco jako:

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

Další možnou obavou je, že servery FTP vracejí informace o čase v GMT (greenwichský střední čas). Pokud je časové pásmo serveru známé kromě komunikace FTP, pak java.util.TimeZone.getOffset () metoda může pomoci upravit datum mezi časovými pásmy. Další informace o této metodě najdete v dokumentaci JDK.

V části „Řešení zbývajících problémů“ se dále uvažuje o načtení časové značky souboru.

Firewally

Brána firewall je obvykle umístěna mezi soukromou podnikovou sítí a veřejnou sítí, jako je internet. Přístup je řízen z privátní sítě do veřejné sítě, ale přístup z veřejné sítě do soukromé sítě je odepřen.

Socks je veřejně dostupný protokol vyvinutý pro použití jako brána firewall pro internet. JDK podporuje proxy Socks 4 a Socks 5, které lze ovládat některými knihovnami. Alternativně může příkazový řádek JVM nastavit parametry proxy Socks: java -DsocksProxyPort = 1080 -DsocksProxyHost = socks.foo.com -Djava.net.socks.username = user01 -Djava.net.socks.password = pass1234 ...

Další běžnou alternativou k podpoře Socks proxy je „socksify“ podkladové vrstvy TCP / IP na klientském počítači. Produkt jako Hummingbird tuto práci zvládne.

JDK také podporuje tunely HTTP. Tyto rozšířené servery proxy neumožňují nahrávání přes FTP. IP * Works / n software umožňuje nastavit parametry tunelu HTTP.

Většina knihoven podporuje aktivní i pasivní připojení: pasivní připojení je užitečné, když je klient za bránou firewall, která inhibuje příchozí připojení k vyšším portům. RFC1579 pojednává o této funkcionalitě přátelské k firewallu podrobněji. Dokumentace některých produktů označuje aktivní a pasivní připojení jako PŘÍSTAV a PASV příkazy.

Paralelní přenos

Když v desktopové aplikaci začne přenos v hlavním jediném vlákně, vše zamrzne. Některé knihovny automaticky obsluhují smyčku událostí pro paralelní přenosy v samostatných vláknech, takže nemusíme vytvářet a spravovat vlastní vlákna.

Podpora specifikace JavaBean

Některé knihovny implementují specifikaci JavaBean. Soulad JavaBean umožňuje vizuální programování, které je součástí hlavních prostředí Java IDE.

$config[zx-auto] not found$config[zx-overlay] not found