Programovanie

Boli skontrolované klientske knižnice Java FTP

Poďme si predstaviť situáciu, keď chceme napísať čistú Java aplikáciu, ktorá musí sťahovať súbory zo vzdialeného počítača, na ktorom je spustený FTP server. Chceme tiež filtrovať stiahnuté súbory na základe informácií o vzdialenom súbore, ako je názov, dátum alebo veľkosť.

Aj keď je možné a možno zábavné napísať obslužný program protokolu pre FTP od nuly, je to tiež ťažké, dlhé a potenciálne riskantné. Pretože radšej nebudeme tráviť čas, úsilie alebo peniaze písaním manipulátora sami, radšej použijeme existujúci softvérový komponent. A v sieti WWW je k dispozícii veľa knižníc. S klientskou knižnicou FTP môže byť sťahovanie súboru napísané v jazyku Java rovnako jednoducho ako:

FTPClient ftpClient = nový FTPClient (); ftpClient.connect ("ftp.foo.com", "user01", "pass1234"); ftpClient.download ("C: \ Temp \", "README.txt"); // Prípadne ďalšie operácie tu ... ftpClient.disconnect (); 

Hľadanie kvalitnej klientskej knižnice Java FTP, ktorá zodpovedá našim potrebám, nie je také jednoduché, ako sa zdá; môže to byť dosť bolestivé. Nájdenie knižnice klientov Java FTP trvá určitý čas. Potom, keď nájdeme všetky existujúce knižnice, ktorú z nich vyberieme? Každá knižnica rieši rôzne potreby. Knižnice majú nerovnakú kvalitu a ich dizajn sa zásadne líši. Každá ponúka inú sadu funkcií a na ich opis používa rôzne typy žargónu.

Vyhodnocovanie a porovnávanie knižníc klientov FTP sa tak môže javiť ako zložité a mätúce. Opätovné použitie existujúcich komponentov je chvályhodný proces, ale v takom prípade môže byť štartovanie odradzujúce. A to je škoda: po výbere dobrej knižnice FTP je zvyšok rutinou.

Cieľom tohto článku je dosiahnuť, aby bol výberový proces krátky, ľahký a hodnotný. Najskôr uvediem zoznam všetkých dostupných knižníc klientov FTP. Potom definujem a popíšem zoznam relevantných kritérií, ktorým by sa knižnice mali nejakým spôsobom venovať. Na záver uvádzam prehľadovú maticu, ktorá poskytuje rýchly prehľad o tom, ako sa knižnice stavajú proti sebe. Všetky tieto informácie poskytujú všetko, čo potrebujeme na rýchle, spoľahlivé a dlhodobé rozhodnutie.

Podpora FTP v JDK

Referenčnou špecifikáciou pre FTP je Žiadosť o komentár: 959 (RFC959). Sun Microsystems poskytuje implementáciu RFC959 v JDK, ale je interná, nezdokumentovaná a nie je k dispozícii žiadny zdroj. Zatiaľ čo RFC959 leží v tieni, je to vlastne zadný koniec verejného rozhrania implementujúceho RFC1738, špecifikáciu URL, ako je znázornené na obrázku 1.

Implementácia RFC1738 je v JDK štandardne ponúkaná. Vykonáva primeranú prácu pre základné operácie prenosu FTP. Je verejná a dokumentovaná a je k dispozícii zdrojový kód. Aby sme ho mohli použiť, napíšeme nasledovné:

URL url = nová URL ("ftp: // user01: [email protected]/README.txt; type = i"); URLConnection urlc = url.openConnection (); InputStream je = urlc.getInputStream (); // Stiahnutie OutputStream os = urlc.getOutputStream (); // Nahrať 

Podpora klientov FTP v JDK prísne dodržiava štandardné odporúčanie, má však niekoľko negatív:

  • Zásadne sa líši od knižníc klientov FTP iných výrobcov; tieto implementujú skôr RFC959 ako RFC1738.
  • RFC959 je implementovaný vo väčšine desktopových nástrojov FTP klienta. Mnoho programátorov Java používa tieto nástroje na pripojenie k serverom FTP. Z dôvodu vkusu tieto nástroje s najväčšou pravdepodobnosťou uprednostňujú knižnice podobné RFC959.
  • The URL a URLConnection triedy otvárajú iba streamy na komunikáciu. Knižnica Sun neponúka priamu podporu pre štruktúrovanie odpovedí nespracovaného servera FTP na použiteľnejšie objekty Java, ako je napríklad String, Súbor, RemoteFilealebo Kalendár. Musíme teda napísať viac kódu, aby sme mohli zapísať údaje do súboru alebo využiť zoznam adresárov.
  • Ako je vysvetlené v časti 3.2.5 dokumentu RFC1738 „Optimalizácia“, adresy URL FTP vyžadujú, aby sa (kontrolné) pripojenie po každej operácii uzavrelo. To je zbytočné a neefektívne pri prenose mnohých malých súborov. Extrémne obmedzujúce servery FTP môžu ďalej považovať takúto réžiu komunikácie za zlý sieťový útok alebo zneužitie a odmietnuť ďalšiu službu.
  • Nakoniec mu chýba niekoľko užitočných funkcií.

Zo všetkých alebo z ktorýchkoľvek z týchto dôvodov je vhodnejšie použiť knižnicu tretej strany. V nasledujúcej časti sú uvedené dostupné alternatívy tretích strán.

Porovnanie knižnice

V zozname nižšie sú uvedené knižnice, ktoré v tomto článku porovnávam. Všetky zodpovedajú referenčnej špecifikácii FTP. Ďalej uvádzam meno poskytovateľa a názov knižnice (kurzívou). Zdroje obsahujú odkazy na webové stránky jednotlivých produktov. Pre použitie knižnice jumpstart spomeniem aj hlavnú triedu klientov FTP.

  1. JScape, iNet Factory: com.jscape.inet.ftp.Ftp
  2. / n softvér, IP * funguje: ipworks.Ftp
  3. Enterprise Distributed Technologies, Knižnica klientov 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 Jakarte, Jakarta Commons / Net: org.apache.commons.net.ftp.FTPClient
  7. JavaShop JNetBeans: jshop.jnet.FTPClient
  8. Slnko, 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 čase písania tohto článku spoločnosť IBM vyhodnocuje vhodnosť ponúkania balíka alphaWorks FTP Bean Suite na svojej webovej stránke. Sťahovanie je zatiaľ zatvorené pre všetkých používateľov.
  • Jakarta Commons / Net je náhradná náhrada za Savarese NetComponents, ktorá už nie je vyvíjaná.
  • Zdá sa, že program JavaShop JNetBeans bol opustený. V čase písania tohto článku bol web offline viac ako mesiac a na moje žiadosti o podporu som nikdy nedostal žiadne odpovede.

Kritériá

Zatiaľ som uviedol kontext a uviedol zoznam dostupných knižníc. Teraz uvádzam zoznam príslušných kritérií, podľa ktorých sa bude každá knižnica hodnotiť. Vymenujem možné hodnoty pre každé kritérium spolu so skratkou (v tučne) použité v konečnej porovnávacej matici.

Podpora produktu

Knižnice poskytujú podporu používateľom prostredníctvom produktovej dokumentácie, kompilovaných Javadocs, vzorových kódov a príkladov aplikácií, ktoré môžu obsahovať komentáre a vysvetlenia. Dodatočnú podporu možno používateľom ponúknuť prostredníctvom fór, zoznamov adries, kontaktnej e-mailovej adresy alebo systému na sledovanie chýb online. / n softvér ponúka rozsiahlu podporu za príplatok.

Motivácia správcu podpory je dôležitým faktorom pre rýchlu podporu. Správcovia podpory môžu byť:

  • Dobrovoľný jednotlivec (Ja)
  • Dobrovoľná skupina (G)
  • Profesionálny subjekt platený za poskytovanie podpory (P)

Licencia

Pri komerčných projektoch je licencia na produkt od začiatku dôležitou vecou. Niektoré knižnice môžu byť voľne distribuované v komerčných produktoch a iné nie. Napríklad GPL (GNU General Public License) je silná, obmedzujúca licencia, zatiaľ čo licencia na softvér Apache Software si vyžaduje zmienku iba pri redistribuovaných produktoch.

Komerčné licencie obmedzujú počet programovaní vývojových staníc s knižnicou, distribúcia samotnej knižnice však nie je obmedzená.

Pre nekomerčné projekty je licencia skôr vecou filozofie; produkt zdarma je citeľný.

Licencie môžu byť:

  • Obchodné (C.)
  • GPL (G)
  • Zadarmo (F); Skontrolujte však obmedzenia v bezplatnej licencii

Niektorí poskytovatelia knižníc poskytujú na požiadanie alternatívne, menej obmedzujúce licencie.

Poskytnutý zdrojový kód

Softvérová knižnica uzavretého zdroja, čierna skrinka, môže byť dráždivá. Mať zdrojový kód môže byť pohodlnejšie z nasledujúcich dôvodov:

  • Pri ladení spustenia kódu aplikácie vám krok do zdroja kódu knižnice pomôže pochopiť správanie knižnice
  • Zdrojový kód obsahuje užitočné komentáre
  • Zdrojový kód je možné rýchlo doladiť tak, aby vyhovoval špeciálnym potrebám
  • Príkladný zdrojový kód môže byť inšpiratívny

Vek

Knižnice boli testované, ladené a podporované od ich prvého verejného vydania. Pretože sa číslovanie verzií v jednotlivých knižniciach líši, zakladám toto kritérium na roku najskoršieho zverejnenia.

Podpora výpisu adresárov

Získanie informácií o vzdialenom súbore (názov, veľkosť, dátum) zo servera je dôležité vo väčšine aplikácií. Protokol FTP ponúka NLST príkaz na načítanie iba názvov súborov; the NLST príkaz je výslovne navrhnutý tak, aby ho mohli programy využívať. The ZOZNAM príkaz ponúka viac informácií o súbore; ako poznamenáva RFC959: „Pretože informácie o súbore sa môžu v jednotlivých systémoch veľmi líšiť, môže byť ťažké automaticky ich použiť v programe, ale môžu byť pre človeka dosť užitočné.“ Žiadna iná štandardná metóda nezíska informácie o súbore; preto sa klientske knižnice snažia využívať ZOZNAM odpoveď. Nie je to však ľahká úloha: pretože pre server nie sú k dispozícii nijaké smerodajné odporúčania ZOZNAM formát odpovede, servery FTP prijali rôzne formáty:

  • Štýl Unix: drwxr-xr-x 1 užívateľ01 ftp 512 29. januára 23:32 prog
  • Alternatívny štýl Unix: drwxr-xr-x 1 užívateľ01 ftp 512 29. januára 1997 prog
  • Alternatívny štýl Unix: drwxr-xr-x 1 1 1 512 29. januára 23:32 prog
  • Symbolický odkaz v štýle Unixu: lrwxr-xr-x 1 užívateľ01 ftp 512 29. januára 23:32 prog -> prog2000
  • Divný štýl Unixu (žiadny priestor medzi používateľom a skupinou): drwxr-xr-x 1 usernameftp 512 29. januára 23:32 prog
  • Štýl MS-DOS: 01-29-97 23:32 prog
  • Štýl Macintosh: priečinok drwxr-xr-x 0 29. januára 23:32 prog
  • Štýl OS / 2: 0 RIADENIE 01-29-97 23:32 PROG

Unixový štýl, potom MS-DOS štýl, sú najrozšírenejšie formáty.

Knižnice klienta Java FTP sa snažia porozumieť a automaticky zistiť čo najviac formátov. Okrem toho ponúkajú rôzne alternatívy riešenia neočakávaných odpovedí na formát:

  • Ďalšia metóda vracajúca nespracovanú odpoveď FTP ako jeden reťazec (S)
  • Ďalšia metóda vracajúca zbierku nespracovaných reťazcov, jeden reťazec na riadok / súbor (C.)
  • Rámec podporujúci zapojiteľné analyzátory (P)

Väčšina knižníc analyzuje ZOZNAM odpovede a štruktúrujte prvotné informácie o súbore do objektov Java. Napríklad s JScape iNet Factory nasledujúci kód načítava a využíva informácie o súboroch prijaté v zozname adresárov:

java.util.Enumeration files = ftpClient.getDirListing (); while (files.hasMoreElements ()) {FtpFile ftpFile = (FtpFile) files.nextElement (); System.out.println (ftpFile.getFilename ()); System.out.println (ftpFile.getFilesize ()); // atď. ďalšie užitočné metódy sú podrobne opísané v Javadoc} 

V časti „Riešenie zostávajúcich problémov“ sa ďalej zaoberá výpisom adresárov.

Získanie časovej pečiatky

V mnohých prípadoch nás zaujíma časová značka najnovšej zmeny vzdialeného súboru. Bohužiaľ, žiadny RFC nezavádza štandardný príkaz FTP na získanie týchto informácií. Fakticky existujú dve metódy:

  1. Získajte tieto informácie z ZOZNAM odpoveď analýzou odpovede servera. Ako ste sa, prosím, dozvedeli v predchádzajúcej časti, bohužiaľ ZOZNAM odozva sa medzi servermi FTP líši a informácie o časovej značke sú niekedy neúplné. Vo formáte Unix nastáva nepresnosť, ak je vzdialený súbor starší ako jeden rok: uvádza sa iba dátum a rok, ale nie hodiny ani minúty.
  2. Použite neštandardné MDTM príkaz, ktorý konkrétne načíta časovú pečiatku poslednej zmeny vzdialeného súboru. Nie všetky servery FTP tento príkaz bohužiaľ implementujú.

Zložitá alternatíva k MDTM podpora príkazov je poslať raw MDTM príkaz a analyzovať odpoveď. Väčšina knižníc poskytuje spôsob odoslania nespracovaného príkazu FTP, napríklad:

Reťazec timeStampString = ftpClient.command ("MDTM README.txt"); 

Ďalšou možnou obavou je, že servery FTP vracajú informácie o čase v GMT (greenwichský stredný čas). Pokiaľ je časové pásmo servera známe okrem FTP komunikácie, java.util.TimeZone.getOffset () metóda môže pomôcť upraviť dátum medzi časovými pásmami. V dokumentácii JDK nájdete ďalšie informácie o tejto metóde.

V časti „Riešenie zostávajúcich problémov“ sa ďalej uvažuje o načítaní časovej pečiatky súboru.

Brány firewall

Brána firewall je zvyčajne umiestnená medzi súkromnou podnikovou sieťou a verejnou sieťou, ako je napríklad internet. Prístup je riadený zo súkromnej siete do verejnej siete, ale prístup z verejnej siete do súkromnej siete je odmietnutý.

Socks je verejne dostupný protokol vyvinutý na použitie ako brána firewall pre internet. JDK podporuje servery Socks 4 a Socks 5, ktoré môžu byť ovládané niektorou z knižníc. Alternatívne môže príkazový riadok JVM nastaviť parametre proxy servera Socks: java -DsocksProxyPort = 1080 -DsocksProxyHost = socks.foo.com -Djava.net.socks.username = user01 -Djava.net.socks.password = pass1234 ...

Ďalšou bežnou alternatívou k podpore Socks proxy je „socksify“ podkladovej vrstvy TCP / IP na klientskom počítači. Produkt ako Hummingbird túto prácu zvládne.

JDK podporuje aj tunely HTTP. Tieto rozšírené servery proxy neumožňujú nahrávanie na FTP. Softvér IP / Works / n softvéru umožňuje nastaviť parametre tunela HTTP.

Väčšina knižníc podporuje aktívne aj pasívne pripojenie: pasívne pripojenie je užitočné, keď je klient za bránou firewall, ktorá brzdí prichádzajúce pripojenia k vyšším portom. RFC1579 pojednáva o tejto funkcii priateľskej k firewallu podrobnejšie. Dokumentácia niektorých produktov označuje aktívne a pasívne pripojenia ako PRÍSTAV a PASV príkazy, resp.

Paralelný prenos

Keď sa v desktopovej aplikácii spustí prenos v hlavnom samostatnom vlákne, všetko zamrzne. Niektoré knižnice automaticky obsluhujú slučku udalostí pre paralelné prenosy v samostatných vláknach, takže nemusíme vytvárať a spravovať svoje vlastné vlákna.

Podpora špecifikácie JavaBean

Niektoré knižnice implementujú špecifikáciu JavaBean. Súlad JavaBean umožňuje vizuálne programovanie, ktoré je súčasťou hlavných IDE Java.

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