Programavimas

Peržiūrėtos „Java FTP“ kliento bibliotekos

Įsivaizduokime situaciją, kai norime parašyti gryną „Java“ programą, kuri turi atsisiųsti failus iš nuotolinio kompiuterio, kuriame veikia FTP serveris. Mes taip pat norime filtruoti atsisiuntimus pagal nuotolinio failo informaciją, pvz., Vardą, datą ar dydį.

Nors įmanoma ir galbūt smagu parašyti FTP protokolo tvarkytuvą nuo nulio, tai padaryti taip pat sunku, ilgai ir potencialiai rizikinga. Kadangi nenorime skirti laiko, pastangų ar pinigų savarankiškai rašydami tvarkytuvą, verčiau pakartotinai naudoti esamą programinės įrangos komponentą. Daugybė bibliotekų yra prieinamos visame pasaulyje. Naudojant FTP kliento biblioteką, failą atsisiųsti galima rašyti „Java“ taip:

FTPClient ftpClient = naujas FTPClient (); ftpClient.connect ("ftp.foo.com", "user01", "pass1234"); ftpClient.download ("C: \ Temp \", "README.txt"); // Galų gale kitos operacijos čia ... ftpClient.disconnect (); 

Ieškoti kokybiškos „Java FTP“ kliento bibliotekos, atitinkančios mūsų poreikius, nėra taip paprasta, kaip atrodo; tai gali būti gana skausminga. Norint rasti „Java FTP“ kliento biblioteką, reikia šiek tiek laiko. Tada, suradę visas esamas bibliotekas, kurią pasirinksime? Kiekviena biblioteka tenkina skirtingus poreikius. Bibliotekos yra nevienodos kokybės, o jų dizainas iš esmės skiriasi. Kiekvienas siūlo skirtingą funkcijų rinkinį ir joms apibūdinti naudoja skirtingų tipų žargonus.

Taigi FTP klientų bibliotekų vertinimas ir palyginimas gali pasirodyti sudėtingas ir painus. Pakartotinis esamų komponentų naudojimas yra pagirtinas procesas, tačiau šiuo atveju pradžia gali būti atgrasanti. Ir tai gėda: pasirinkus gerą FTP biblioteką, visa kita yra įprasta.

Šiuo straipsniu siekiama, kad tas atrankos procesas būtų trumpas, lengvas ir naudingas. Pirmiausia išvardinu visas galimas FTP klientų bibliotekas. Tada aš apibrėžiu ir aprašau svarbių kriterijų, kuriuos bibliotekos turėtų kažkaip spręsti, sąrašą. Galiausiai pateikiu apžvalgos matricą, kurioje pateikiama greita apžvalga, kaip bibliotekos kaupiasi viena prieš kitą. Visa ši informacija pateikia viską, ko reikia norint greitai, patikimai ir ilgai trunkantį sprendimą.

FTP palaikymas JDK

FTP informacinė specifikacija yra „Request for Comments“: „Request for Comments“: 959 (RFC959). „Sun Microsystems“ teikia RFC959 diegimą JDK, tačiau jis yra vidinis, be dokumentų ir nėra šaltinio. Nors RFC959 yra šešėlyje, tai iš tikrųjų yra viešosios sąsajos, įdiegiančios RFC1738, URL specifikacija, kaip parodyta 1 paveiksle.

JDK standartiškai siūloma įdiegti RFC1738. Jis atlieka pagrįstą darbą atliekant pagrindines FTP perdavimo operacijas. Jis yra viešas ir dokumentais patvirtintas, o šaltinio kodas pateikiamas. Norėdami jį naudoti, rašome:

URL URL = naujas URL ("ftp: // user01: [email protected]/README.txt; type = i"); URLConnection urlc = url.openConnection (); „InputStream“ yra = urlc.getInputStream (); // Norėdami atsisiųsti OutputStream os = urlc.getOutputStream (); // Norėdami įkelti 

FTP kliento palaikymas JDK griežtai laikosi standartinės rekomendacijos, tačiau jis turi keletą trūkumų:

  • Jis iš esmės skiriasi nuo trečiųjų šalių FTP klientų bibliotekų; šie įgyvendina RFC959, o ne RFC1738.
  • RFC959 įdiegtas daugumoje darbalaukio FTP kliento įrankių. Daugelis „Java“ programuotojų naudoja šias priemones prisijungdami prie FTP serverių. Dėl skonio šie įrankiai greičiausiai teikia pirmenybę bibliotekoms, kurios panašios į RFC959.
  • URL ir URLConnection klasės atveria tik bendravimo srautus. „Sun“ biblioteka nesuteikia tiesioginio palaikymo neapdorotų FTP serverio atsakymų struktūrizavimui į tokius labiau pritaikomus „Java“ objektus kaip Stygos, Failas, „RemoteFile“arba Kalendorius. Taigi, norėdami įrašyti duomenis į failą arba pasinaudoti katalogų sąrašu, turime parašyti daugiau kodų.
  • Kaip paaiškinta RFC1738 3.2.5 skirsnyje „Optimizavimas“, FTP URL reikalauja, kad (valdymo) ryšys būtų uždarytas po kiekvienos operacijos. Tai yra švaistoma ir neveiksminga daugeliui mažų failų perkelti. Be to, itin ribojantys FTP serveriai gali laikyti tokią komunikacijos pridėtinę dalį blogo tinklo ataka ar piktnaudžiavimu ir neleisti teikti tolesnių paslaugų.
  • Galiausiai, jame nėra kelių naudingų funkcijų.

Dėl visų šių priežasčių geriau naudoti trečiosios šalies biblioteką. Šiame skyriuje pateikiamos galimos trečiųjų šalių alternatyvos.

Bibliotekų palyginimas

Žemiau pateiktame sąraše pateikiamos bibliotekos, kurias lyginu šiame straipsnyje. Visi jie vadovaujasi standartine FTP specifikacija. Žemiau aš pamenu paslaugų teikėjo pavadinimą ir bibliotekos pavadinimą (kursyvu). Šaltiniai apima nuorodas į kiekvieno produkto svetainę. Norėdami pradėti naudotis biblioteka, paminėsiu ir pagrindinę FTP klientų klasę.

  1. „JScape“, „iNet“ gamykla: com.jscape.inet.ftp.Ftp
  2. / n programinė įranga, IP * Veikia: ipworks.Ftp
  3. Įmonių platinamos technologijos, „Java FTP“ kliento biblioteka: 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. Džakartos projektas, Jakarta Commons / Net: org.apache.commons.net.ftp.FTPClient
  7. „JavaShop“ „JNetBeans“: jshop.jnet.FTPClient
  8. Saulė, JDK: sun.net.ftp.FtpClient
  9. Florent Cueto, „JavaFTP“ API: com.cqs.ftp.FTP
  10. Bea Petrovicova, jFTP: cz.dhl.ftp.Ftp
  11. „Globus“ projektas, „Java CoG“ rinkinys: org.globus.io.ftp.FTPClient

Pastabos:

  • Šio rašymo metu IBM vertina tinkamumą pasiūlyti savo „alphaWorks FTP Bean Suite“ savo svetainėje. Kol kas atsisiuntimas uždarytas visiems vartotojams.
  • „Jakarta Commons / Net“ yra „Savarese NetComponents“ pakaitalas, kuris nebėra sukurtas.
  • Panašu, kad „JavaShop JNetBeans“ buvo atsisakyta. Rašymo metu svetainė buvo išjungta daugiau nei mėnesį ir niekada negavau atsakymų į savo palaikymo užklausas.

Kriterijai

Iki šiol supažindinau su kontekstu ir išvardijau turimas bibliotekas. Dabar išvardiju atitinkamus kriterijus, pagal kuriuos bus vertinama kiekviena biblioteka. Aš išvardiju galimas kiekvieno kriterijaus vertes kartu su santrumpa (in drąsus), naudojamą galutinėje palyginimo matricoje.

Produkto palaikymas

Bibliotekos teikia paramą vartotojams naudodamos produkto dokumentaciją, sudarytus „Javadocs“, kodo pavyzdžius ir programos pavyzdį, kuriame gali būti komentarų ir paaiškinimų. Papildoma pagalba vartotojams gali būti pasiūlyta per forumus, adresų sąrašus, kontaktinį el. Pašto adresą ar internetinę klaidų stebėjimo sistemą. / n programinė įranga siūlo platų palaikymą už papildomą mokestį.

Palaikymo administratoriaus motyvacija yra svarbus greito palaikymo veiksnys. Palaikymo administratoriai gali būti:

  • Savanoriškas asmuo ()
  • Savanoriška grupė (G)
  • Profesinis subjektas, mokamas už paramą (P)

Licencija

Komerciniams projektams produkto licencija yra svarbus dalykas, kurį reikia apsvarstyti nuo pat pradžių. Kai kurias bibliotekas galima laisvai platinti komerciniuose produktuose, o kitas - ne. Pavyzdžiui, GPL („GNU General Public License“) yra stipri, ribojanti licencija, o „Apache“ programinės įrangos licencijai reikia paminėti tik perskirstytus produktus.

Komercinės licencijos riboja kūrimo darbo vietų, programuojamų su biblioteka, skaičių, tačiau pačios bibliotekos platinimas nėra ribojamas.

Nekomerciniams projektams licencija yra daugiau filosofijos reikalas; nemokamas produktas yra vertinamas.

Licencijos gali būti:

  • Komercinis (C)
  • GPL (G)
  • Laisvas (F); tačiau patikrinkite nemokamą licenciją, ar nėra apribojimų

Kai kurie bibliotekų teikėjai pagal poreikį teikia alternatyvias, mažiau ribojančias licencijas.

Pateiktas šaltinio kodas

Uždaro šaltinio juodosios dėžės programinės įrangos biblioteka gali erzinti. Šaltinio kodą turėti gali būti patogiau dėl šių priežasčių:

  • Derindami programos kodo vykdymą, įėję į bibliotekos kodo šaltinį galite lengviau suprasti bibliotekos elgseną
  • Šaltinio kode yra naudingų komentarų
  • Šaltinio kodą galima greitai pritaikyti, kad jis atitiktų specialiuosius poreikius
  • Pavyzdinis šaltinio kodas gali būti įkvepiantis

Amžius

Bibliotekos buvo tikrinamos, derinamos ir palaikomos nuo pirmojo viešo jų išleidimo. Kadangi versijų numeracija įvairiose bibliotekose skiriasi, šį kriterijų grindžiu ankstyviausio viešo išleidimo metais.

Katalogų sąrašų palaikymas

Nuotolinio failo informacijos (vardo, dydžio, datos) gavimas iš serverio yra svarbus daugelyje programų. FTP protokolas siūlo NLST komanda nuskaityti tik failų pavadinimus; NLST komanda yra aiškiai sukurta naudoti programose. SĄRAŠAS komanda siūlo daugiau informacijos apie failą; kaip pažymi RFC959, "kadangi failo informacija gali skirtis priklausomai nuo sistemos, šią informaciją gali būti sunku automatiškai naudoti programoje, tačiau ji gali būti gana naudinga vartotojui." Joks kitas standartinis metodas negauna failo informacijos; todėl klientų bibliotekos bando išnaudoti SĄRAŠAS atsakymą. Tačiau tai nėra lengva užduotis: kadangi nėra autoritetingų rekomendacijų SĄRAŠAS atsakymo formatą, FTP serveriai pasirinko įvairius formatus:

  • Unix stilius: drwxr-xr-x 1 user01 ftp 512 sausio 29 23:32 prog
  • Alternatyvus „Unix“ stilius: drwxr-xr-x 1 user01 ftp 512 1997 m. sausio 29 d
  • Alternatyvus „Unix“ stilius: drwxr-xr-x 1 1 1 512 sausio 29 23:32 prog
  • Simbolinė Unix stiliaus nuoroda: lrwxr-xr-x 1 user01 ftp 512 sausio 29 23:32 prog -> prog2000
  • Keistas „Unix“ stilius (tarp vartotojo ir grupės nėra vietos): drwxr-xr-x 1 usernameftp 512 sausio 29 23:32 prog
  • MS-DOS stilius: 01-29-97 23:32 prog
  • „Macintosh“ stilius: drwxr-xr-x aplankas 0 sausio 29 23:32 prog
  • OS / 2 stilius: 0 DIR 01-29-97 23:32 PROG

Unix stilius, tada MS-DOS stilius, yra labiausiai paplitę formatai.

„Java FTP“ klientų bibliotekos bando suprasti ir automatiškai aptikti kuo daugiau formatų. Be to, jie siūlo įvairias netikėto formato atsakymų tvarkymo alternatyvas:

  • Papildomas metodas, grąžinantis neapdorotą FTP atsakymą kaip vieną eilutę (S)
  • Papildomas metodas, grąžinantis neapdorotų eilučių rinkinį, po vieną eilutę eilutėje / faile (C)
  • Sistema, palaikanti kištukinius analizatorius (P)

Dauguma bibliotekų analizuoja SĄRAŠAS atsakymus ir neapdorotų failų informaciją susistemina į „Java“ objektus. Pavyzdžiui, naudojant „JScape iNet Factory“, šis kodas nuskaito ir naudoja failų informaciją, gautą katalogų sąraše:

java.util.Enumeration files = ftpClient.getDirListing (); while (failai.hasMoreElements ()) {FtpFile ftpFile = (FtpFile) failai.nextElement (); System.out.println (ftpFile.getFilename ()); System.out.println (ftpFile.getFilesize ()); // ir kiti naudingi metodai yra išsamiai aprašyti „Javadoc“} 

Skyriuje „Likusių problemų sprendimai“ toliau nagrinėjami katalogų sąrašai.

Laiko žymos gavimas

Daugeliu atvejų mus domina naujausio nuotolinio failo modifikavimo laiko žyma. Deja, jokia RFC nepateikia standartinės FTP komandos, kad gautų šią informaciją. Yra du faktiniai metodai:

  1. Gaukite šią informaciją iš SĄRAŠAS atsakymas analizuojant atsakymą į serverį. Deja, kaip sužinojote ankstesniame skyriuje, SĄRAŠAS atsakymas skiriasi tarp FTP serverių, o laiko žymos informacija kartais yra neišsami. „Unix“ formatu netikslumas įvyksta, kai nuotolinis failas yra daugiau nei vienerių metų senumo: nurodoma tik data ir metai, bet ne valandos ar minutės.
  2. Naudokite nestandartinius MDTM komandą, kuri gauna nuotolinio failo paskutinio modifikavimo laiko žymą. Deja, ne visi FTP serveriai įgyvendina šią komandą.

Įmantri alternatyva MDTM komandos palaikymas yra siųsti žaliavą MDTM komanduoti ir analizuoti atsakymą. Dauguma bibliotekų pateikia neapdorotos FTP komandos siuntimo būdą, panašų į:

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

Kitas galimas rūpestis yra tai, kad FTP serveriai pateikia informaciją apie laiką GMT (Greenwich Mean Time). Jei serverio laiko juosta žinoma be FTP ryšio, java.util.TimeZone.getOffset () metodas gali padėti sureguliuoti datą tarp laiko juostų. Norėdami gauti daugiau informacijos apie šį metodą, žr. JDK dokumentaciją.

Skyriuje „Likusių problemų sprendimai“ toliau nagrinėjamas failo laiko žymos gavimas.

Ugniasienės

Paprastai ugniasienė yra tarp privačios įmonės tinklo ir viešojo tinklo, pavyzdžiui, interneto. Prieiga valdoma iš privataus tinklo į viešąjį tinklą, tačiau iš viešojo tinklo prieiga prie privataus tinklo uždrausta.

Kojinės yra viešai prieinamas protokolas, sukurtas naudoti kaip užkardos interneto vartai. JDK palaiko „Socks 4“ ir „Socks 5“ įgaliojimus, kuriuos gali valdyti kai kurios bibliotekos. Kaip alternatyvą, JVM komandinė eilutė gali nustatyti „Socks“ tarpinio serverio parametrus: java -DsocksProxyPort = 1080 -DsocksProxyHost = socks.foo.com -Djava.net.socks.username = user01 -Djava.net.socks.password = pass1234 ...

Kita įprasta „Socks“ tarpinio serverio palaikymo alternatyva yra pagrindinio TCP / IP sluoksnio „suklifavimas“ kliento mašinoje. Toks produktas, kaip Kolibris, gali tą darbą atlikti.

JDK taip pat palaiko HTTP tunelius. Šie plačiai paplitę tarpiniai serveriai neleidžia įkelti FTP. / n programinės įrangos IP * Works leidžia nustatyti HTTP tunelio parametrus.

Dauguma bibliotekų palaiko ir aktyvius, ir pasyvius ryšius: pasyvus ryšys yra naudingas, kai klientas yra už ugniasienės, kuri slopina gaunamus ryšius su aukštesniais prievadais. RFC1579 išsamiau aptaria šią ugniasienei pritaikytą funkciją. Kai kurių produktų dokumentuose aktyvūs ir pasyvūs ryšiai nurodomi kaip Uostas ir PASV atitinkamai komandos.

Lygiagretus perdavimas

Darbalaukio programoje, kai perkėlimas prasideda pagrindiniame viename gijoje, viskas užšąla. Kai kurios bibliotekos automatiškai aptarnauja įvykių ciklą lygiagrečiam perdavimui atskirose gijose, todėl mums nereikia kurti ir tvarkyti savo gijų.

„JavaBean“ specifikacijų palaikymas

Kai kuriose bibliotekose įdiegta „JavaBean“ specifikacija. „JavaBean“ atitiktis leidžia vizualiai programuoti, kuris pateikiamas pagrindiniuose „Java IDE“.