Programiranje

Pregledane odjemalske knjižnice Java FTP

Predstavljajmo si situacijo, ko želimo napisati čisto aplikacijo Java, ki mora prenesti datoteke iz oddaljenega računalnika s strežnikom FTP. Prenose želimo filtrirati tudi na podlagi informacij o oddaljenih datotekah, kot so ime, datum ali velikost.

Čeprav je mogoče in morda zabavno napisati vodnik protokola za FTP iz nič, je to tudi težko, dolgo in potencialno tvegano. Ker raje ne bi porabili časa, truda ali denarja za samostojno pisanje vodnika, raje ponovno uporabimo obstoječo programsko komponento. Na svetovnem spletu je na voljo veliko knjižnic. Z odjemalsko knjižnico FTP lahko prenos datoteke v Java zapišem tako preprosto kot:

FTPClient ftpClient = nov FTPClient (); ftpClient.connect ("ftp.foo.com", "user01", "pass1234"); ftpClient.download ("C: \ Temp \", "README.txt"); // Sčasoma druge operacije tukaj ... ftpClient.disconnect (); 

Iskanje kakovostne odjemalske knjižnice Java FTP, ki ustreza našim potrebam, ni tako preprosto, kot se zdi; lahko je precej boleče. Traja nekaj časa, da poiščem odjemalsko knjižnico Java. Potem, ko najdemo vse obstoječe knjižnice, katero izberemo? Vsaka knjižnica obravnava različne potrebe. Knjižnice so neenako kakovostne, njihova zasnova pa se bistveno razlikuje. Vsak ponuja drugačen nabor funkcij in za opisovanje uporablja različne vrste žargonov.

Tako se lahko ocena in primerjava odjemalskih knjižnic FTP izkažeta za težko in zmedeno. Ponovna uporaba obstoječih komponent je hvalevreden postopek, vendar je v tem primeru zagon lahko odvračalen. In to je sramota: po izbiri dobre knjižnice FTP je ostalo rutinsko.

Ta članek želi ta izbirni postopek narediti kratek, enostaven in vreden. Najprej navedem vse razpoložljive odjemalske knjižnice FTP. Nato določim in opišem seznam ustreznih meril, ki bi jih knjižnice morale na nek način obravnavati. Na koncu predstavljam pregledno matrico, ki daje hiter pregled, kako se knjižnice naslanjajo ena na drugo. Vse te informacije zagotavljajo vse, kar potrebujemo za hitro, zanesljivo in dolgotrajno odločitev.

Podpora za FTP v JDK

Referenčna specifikacija za FTP je Zahteva za komentarje: 959 (RFC959). Sun Microsystems zagotavlja izvedbo RFC959 v JDK, vendar je interna, nedokumentirana in ni na voljo nobenega vira. Medtem ko RFC959 leži v senci, je dejansko zadnji del javnega vmesnika, ki izvaja RFC1738, specifikacijo URL-ja, kot je prikazano na sliki 1.

Izvedba RFC1738 je standardno na voljo v JDK. Opravlja razumno delo za osnovne operacije prenosa FTP. Je javen in dokumentiran, na voljo pa je tudi izvorna koda. Da bi jo uporabili, zapišemo naslednje:

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

Podpora za odjemalca FTP v JDK dosledno sledi standardnim priporočilom, vendar ima več slabosti:

  • V bistvu se razlikuje od neodvisnih knjižnic odjemalcev FTP; ti namesto RFC1738 izvajajo RFC959.
  • RFC959 se uporablja v večini namiznih orodij FTP-odjemalcev. Mnogi programerji Java uporabljajo ta orodja za povezavo s strežniki FTP. Ta orodja imajo najverjetneje raje knjižnice, podobne RFC959.
  • The URL in URLConnection razredi samo odpirajo tokove za komunikacijo. Knjižnica Sun ne ponuja neposredne podpore za strukturiranje surovih odgovorov strežnika FTP v bolj uporabne predmete Java, kot je Vrvica, mapa, RemoteFile, ali Koledar. Zato moramo napisati več kode samo zato, da zapišemo podatke v datoteko ali izkoristimo seznam imenikov.
  • Kot je pojasnjeno v oddelku 3.2.5 RFC1738, "Optimizacija", URL-ji FTP zahtevajo, da se (nadzorna) povezava po vsaki operaciji zapre. To je potratno in neučinkovito za prenos številnih majhnih datotek. Poleg tega lahko izjemno omejevalni strežniki FTP takšno komunikacijsko obremenitev obravnavajo kot zlorabo omrežnega napada ali zlorabe in zanikajo nadaljnje storitve.
  • Na koncu mu manjka več uporabnih funkcij.

Zaradi vseh ali katerega koli od teh razlogov je uporaba knjižnice drugih proizvajalcev zaželena. Naslednji odsek navaja razpoložljive druge možnosti.

Primerjava knjižnic

Spodnji seznam opisuje knjižnice, ki jih primerjam v tem članku. Vsi upoštevajo referenčne specifikacije FTP. Spodaj omenim ime ponudnika in ime knjižnice (v ležečem tisku). Viri vključujejo povezave do spletnega mesta vsakega izdelka. Za začetek uporabe knjižnice omenim tudi glavni razred odjemalca FTP.

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

Opombe:

  • V času pisanja tega članka IBM ocenjuje primernost ponudbe svojega alphaWorks FTP Bean Suite na svoji spletni strani. Za zdaj je prenos zaprt za vse uporabnike.
  • Jakarta Commons / Net je nadomestna zamenjava za Savarese NetComponents, ki ni več razvita.
  • Zdi se, da je JavaShop JNetBeans opuščen. V času pisanja tega spletnega mesta spletno mesto ni več kot mesec dni in nikoli nisem prejel nobenega odgovora na svoje zahteve za podporo.

Merila

Do zdaj sem predstavil kontekst in navedel razpoložljive knjižnice. Zdaj navajam ustrezna merila, na podlagi katerih bo ocenjena vsaka knjižnica. Za vsako merilo naštejem možne vrednosti skupaj s kratico (v krepko), uporabljen v matriki končne primerjave.

Podpora za izdelke

Knjižnice nudijo podporo uporabnikom prek dokumentacije o izdelkih, zbranega Javadocs-a, vzorčne kode in primera aplikacije, ki lahko vključuje komentarje in pojasnila. Uporabnikom lahko ponudimo dodatno podporo prek forumov, poštnih seznamov, kontaktnega e-poštnega naslova ali spletnega sistema za sledenje napakam. / n programska oprema ponuja obsežno podporo za doplačilo.

Motivacija skrbnika podpore je pomemben dejavnik hitre podpore. Skrbniki podpore so lahko:

  • Prostovoljni posameznik (jaz)
  • Prostovoljna skupina (G)
  • Poklicni subjekt, ki je plačan za podporo (P)

Licenca

Za komercialne projekte je licenca za izdelek pomembna zadeva, ki jo je treba upoštevati od začetka. Nekatere knjižnice se lahko prosto distribuirajo v komercialne izdelke, druge pa ne. Na primer, GPL (GNU General Public License) je močna, omejujoča licenca, medtem ko licenca za programsko opremo Apache zahteva le omembo v prerazporejenih izdelkih.

Komercialne licence omejujejo število programov za razvoj delovnih postaj s knjižnico, vendar sama distribucija knjižnice ni omejena.

Pri nekomercialnih projektih je licenca bolj stvar filozofije; zaznaven je brezplačen izdelek.

Licence so lahko:

  • Komercialni (C)
  • GPL (G)
  • Prost (F); vendar preverite brezplačno licenco za omejitve

Nekateri ponudniki knjižnic na zahtevo nudijo nadomestne, manj omejevalne licence.

Navedena izvorna koda

Knjižnica programske opreme s črnimi skrinjicami z zaprtimi viri lahko draži. Uporaba izvorne kode je lahko bolj udobna iz naslednjih razlogov:

  • Pri odpravljanju napak pri izvajanju kode aplikacije vam lahko vstop v vir kode knjižnice pomaga razumeti vedenje knjižnice
  • Izvorna koda vsebuje koristne komentarje
  • Izvorno kodo lahko hitro prilagodite tako, da ustreza posebnim potrebam
  • Zgledna izvorna koda je lahko navdihujoča

Starost

Knjižnice so bile preizkušene, razhroščene in podprte od njihove prve javne izdaje. Ker se oštevilčenje različic med knjižnicami razlikuje, to merilo utemeljujem na letu najzgodnejše javne izdaje.

Podpora za seznam imenikov

Pridobivanje informacij o oddaljeni datoteki (ime, velikost, datum) s strežnika je v večini programov pomembno. FTP protokol ponuja NLST ukaz za pridobivanje samo imen datotek; NLST ukaz je izrecno zasnovan za uporabo programov. The SEZNAM ukaz ponuja več informacij o datoteki; kot ugotavlja RFC959, "Ker se informacije v datoteki od sistema do sistema lahko zelo razlikujejo, jih je morda težko samodejno uporabiti v programu, lahko pa so zelo koristne za človeškega uporabnika." Nobena druga metoda ne pridobi podatkov o datoteki; zato odjemalske knjižnice poskušajo izkoristiti SEZNAM odziv. Toda to ni lahka naloga: ker nobeno verodostojno priporočilo ni na voljo SEZNAM oblika odziva, strežniki FTP so sprejeli različne formate:

  • Unix slog: drwxr-xr-x 1 uporabnik01 ftp 512 29. januar 23:32 prog
  • Nadomestni slog Unixa: drwxr-xr-x 1 uporabnik01 ftp 512 29. januar 1997 prog
  • Nadomestni slog Unixa: drwxr-xr-x 1 1 1 512 29. januar 23:32 prog
  • Simbolična povezava v slogu Unix: lrwxr-xr-x 1 uporabnik01 ftp 512 29. januar 23:32 prog -> prog2000
  • Čuden slog Unixa (brez prostora med uporabnikom in skupino): drwxr-xr-x 1 uporabniško imeftp 512 29. januar 23:32 prog
  • MS-DOS slog: 29-29-97 23:32 prog
  • Macintosh slog: mapa drwxr-xr-x 0 29. januar 23:32 prog
  • Slog OS / 2: 0 DIR 01-29-97 23:32 PROG

Unix slog, nato MS-DOS slog, sta najbolj razširjeni obliki.

Odjemalske knjižnice Java FTP poskušajo razumeti in samodejno zaznati čim več formatov. Poleg tega ponujajo različne možnosti za obravnavo nepričakovanih odgovorov v obliki:

  • Dodatna metoda, ki vrne surovi odgovor FTP kot en niz (S)
  • Dodatna metoda, ki vrne zbirko surovih nizov, en niz na vrstico / datoteko (C)
  • Okvir, ki podpira vstavljive razčlenjevalnike (P)

Večina knjižnic razčleni SEZNAM odzive in strukturira neobdelane podatke o datotekah v predmete Java. Na primer, z JScape iNet Factory naslednja koda pridobi in izkoristi informacije o datotekah, prejete v seznamu imenikov:

java.util.Enumeration files = ftpClient.getDirListing (); medtem ko (files.hasMoreElements ()) {FtpFile ftpFile = (FtpFile) files.nextElement (); System.out.println (ftpFile.getFilename ()); System.out.println (ftpFile.getFilesize ()); // itd. druge koristne metode so podrobno opisane v Javadoc} 

Oddelek "Rešitve za preostale težave" nadalje obravnava sezname imenikov.

Pridobivanje časovnega žiga

V mnogih primerih nas zanima časovni žig najnovejše spremembe oddaljene datoteke. Žal noben RFC ne uvaja standardnega ukaza FTP za pridobivanje teh informacij. Obstajata dve dejanski metodi:

  1. Pridobite te informacije iz SEZNAM odgovor z razčlenjevanjem odgovora strežnika. Kot ste že izvedeli v prejšnjem razdelku, je SEZNAM odziv se med strežniki FTP razlikuje, podatki o časovnem žigu pa so včasih nepopolni. V formatu Unix se nenatančnost pojavi, ko je oddaljena datoteka stara več kot eno leto: podana sta le datum in leto, ne pa tudi ure ali minute.
  2. Uporabite nestandardno MDTM ukaz, ki natančno pridobi časovni žig zadnje spremembe oddaljene datoteke. Na žalost vsi strežniki FTP tega ukaza ne izvajajo.

Zapletena alternativa MDTM ukazna podpora je pošiljanje surovega MDTM ukaz in razčlenite odgovor. Večina knjižnic ponuja način pošiljanja surovega ukaza FTP, na primer:

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

Druga možna skrb je, da strežniki FTP vrnejo informacije o času v GMT (Greenwich Mean Time). Če je poleg komunikacije FTP znan tudi časovni pas strežnika, se java.util.TimeZone.getOffset () metoda lahko pomaga prilagoditi datum med časovnimi pasovi. Za dodatne informacije o tej metodi glejte dokumentacijo JDK.

Oddelek "Rešitve za preostale težave" nadalje obravnava iskanje časovnega žiga datoteke.

Požarni zidovi

Običajno je požarni zid nameščen med zasebnim podjetniškim omrežjem in javnim omrežjem, kot je internet. Dostop se upravlja iz zasebnega omrežja v javno omrežje, vendar je dostop iz javnega omrežja v zasebno omrežje zavrnjen.

Socks je javno dostopen protokol, razvit za uporabo kot internetni prehod požarnega zidu. JDK podpira namestitve Socks 4 in Socks 5, ki jih lahko nadzirajo nekatere knjižnice. Kot drugo možnost lahko ukazna vrstica JVM nastavi parametre proxyja Socks: java -DsocksProxyPort = 1080 -DsocksProxyHost = socks.foo.com -Djava.net.socks.username = user01 -Djava.net.socks.password = pass1234 ...

Druga pogosta alternativa podpori za proxy Socks je "socksify" osnovne plasti TCP / IP na odjemalskem računalniku. Izdelek, kot je Hummingbird, lahko to opravi.

JDK podpira tudi HTTP predore. Ti razširjeni posredniki ne dovoljujejo nalaganja FTP. / n programske opreme IP * Works vam omogoča nastavitev parametrov tunela HTTP.

Večina knjižnic podpira tako aktivne kot pasivne povezave: pasivna povezava je uporabna, ko je odjemalec za požarnim zidom, ki onemogoča dohodne povezave do višjih vrat. RFC1579 podrobneje razpravlja o tej funkciji, prijazni požarnemu zidu. Dokumentacija nekaterih izdelkov se na aktivne in pasivne povezave nanaša kot PRISTANIŠČE in PASV ukazov.

Vzporedni prenos

Ko se prenos začne v glavni niti, se v namizni aplikaciji vse zamrzne. Nekatere knjižnice samodejno servisirajo zanko dogodkov za vzporedne prenose v ločenih nitih, zato nam ni treba ustvarjati in upravljati lastnih niti.

Podpora za specifikacije JavaBean

Nekatere knjižnice izvajajo specifikacijo JavaBean. Skladnost z JavaBean omogoča vizualno programiranje, ki je predstavljeno v večjih IDE Java.

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