Programmēšana

Pārskatītas Java FTP klientu bibliotēkas

Iedomāsimies situāciju, kad mēs vēlamies uzrakstīt tīru Java lietojumprogrammu, kurai faili jāielādē no attālā datora, kurā darbojas FTP serveris. Mēs arī vēlamies filtrēt lejupielādes, pamatojoties uz attālo failu informāciju, piemēram, vārdu, datumu vai lielumu.

Lai gan ir iespējams un varbūt jautri rakstīt FTP protokolu apstrādātāju no nulles, tas ir arī grūti, ilgi un potenciāli riskanti. Tā kā mēs labāk nevēlamies tērēt laiku, pūles vai naudu, rakstot apstrādātāju patstāvīgi, tā vietā mēs vēlamies atkārtoti izmantot esošo programmatūras komponentu. Un daudz bibliotēku ir pieejamas tīmeklī. Izmantojot FTP klienta bibliotēku, faila lejupielādi var rakstīt Java valodā vienkārši:

FTPClient ftpClient = jauns FTPClient (); ftpClient.connect ("ftp.foo.com", "user01", "pass1234"); ftpClient.download ("C: \ Temp \", "README.txt"); // Galu galā citas operācijas šeit ... ftpClient.disconnect (); 

Meklēt kvalitatīvu Java FTP klientu bibliotēku, kas atbilstu mūsu vajadzībām, nav tik vienkārši, kā šķiet; tas var būt diezgan sāpīgi. Java FTP klienta bibliotēkas atrašana prasa zināmu laiku. Tad, kad būsim atraduši visas esošās bibliotēkas, kuru mēs atlasīsim? Katra bibliotēka risina dažādas vajadzības. Bibliotēkas ir nevienlīdzīgas kvalitātes ziņā, un to dizains būtiski atšķiras. Katrs piedāvā atšķirīgu funkciju kopumu un to aprakstīšanai izmanto dažāda veida žargonus.

Tādējādi FTP klientu bibliotēku novērtēšana un salīdzināšana var izrādīties sarežģīta un mulsinoša. Esošo komponentu atkārtota izmantošana ir slavējams process, taču šajā gadījumā sākšana var atturēt. Un tas ir kauns: pēc labas FTP bibliotēkas izvēles pārējais ir ikdiena.

Šī raksta mērķis ir padarīt šo atlases procesu īsu, vieglu un vērtīgu. Vispirms es uzskaita visas pieejamās FTP klientu bibliotēkas. Tad es definēju un aprakstu to atbilstošo kritēriju sarakstu, kuri bibliotēkām būtu kaut kādā veidā jārisina. Visbeidzot, es iepazīstinu ar pārskata matricu, kas sniedz ātru pārskatu par to, kā bibliotēkas sakrājas viena pret otru. Visa šī informācija sniedz visu nepieciešamo, lai pieņemtu ātru, uzticamu un ilgstošu lēmumu.

FTP atbalsts JDK

FTP atsauces specifikācija ir Pieprasīt komentārus: 959 (RFC959). Sun Microsystems nodrošina RFC959 ieviešanu JDK, taču tā ir iekšēja, bez dokumentiem, un avots nav norādīts. Kaut arī RFC959 atrodas ēnā, tas faktiski ir publiskās saskarnes aizmugure, kas ievieš RFC1738, URL specifikāciju, kā parādīts 1. attēlā.

JDK standartā tiek piedāvāta RFC1738 ieviešana. Tas veic saprātīgu darbu pamata FTP pārsūtīšanas operācijām. Tas ir publisks un dokumentēts, un tiek nodrošināts pirmkods. Lai to izmantotu, mēs rakstām šādi:

URL url = jauns URL ("ftp: // user01: [email protected]/README.txt; type = i"); URLConnection urlc = url.openConnection (); InputStream ir = urlc.getInputStream (); // Lai lejupielādētu OutputStream os = urlc.getOutputStream (); // Lai augšupielādētu 

FTP klientu atbalsts JDK stingri ievēro standarta ieteikumus, taču tam ir vairākas ēnas puses:

  • Tas būtiski atšķiras no trešo pušu FTP klientu bibliotēkām; šie drīzāk ievieš RFC959, nevis RFC1738.
  • RFC959 ir ieviests lielākajā daļā darbvirsmas FTP klientu rīku. Daudzi Java programmētāji izmanto šos rīkus, lai izveidotu savienojumu ar FTP serveriem. Pēc garšas šie rīki, visticamāk, dod priekšroku RFC959 līdzīgām bibliotēkām.
  • The URL un URLConnection klases tikai saziņas plūsmas. Saules bibliotēka nepiedāvā tiešu atbalstu neapstrādātu FTP servera atbilžu strukturēšanai tādos izmantojamākos Java objektos kā Stīga, Fails, RemoteFilevai Kalendārs. Tāpēc mums ir jāraksta vairāk koda, lai tikai ierakstītu datus failā vai izmantotu direktoriju sarakstu.
  • Kā paskaidrots RFC1738 3.2.5. Sadaļā "Optimizācija", FTP vietrāžiem URL ir jānoslēdz (vadības) savienojums pēc katras darbības. Tas ir izšķērdīgi un nav efektīvs daudzu mazu failu pārsūtīšanai. Turklāt ārkārtīgi ierobežojošie FTP serveri var uzskatīt šādu komunikācijas pieskaitāmo daļu par ļaunu tīkla uzbrukumu vai ļaunprātīgu izmantošanu un liegt turpmāku servisu.
  • Visbeidzot, tam trūkst vairākas noderīgas funkcijas.

Visu šo iemeslu dēļ ir vēlams izmantot trešās puses bibliotēku. Šajā sadaļā ir uzskaitītas pieejamās trešo pušu alternatīvas.

Bibliotēku salīdzinājums

Zemāk esošajā sarakstā ir izklāstītas bibliotēkas, kuras es salīdzinu šajā rakstā. Viņi visi ievēro atsauces FTP specifikāciju. Zemāk es pieminēju pakalpojumu sniedzēja nosaukumu un bibliotēkas nosaukumu (kursīvā). Resursi ietver saites uz katra produkta vietni. Lai sāktu bibliotēkas lietošanu, es pieminēju arī galveno FTP klientu klasi.

  1. JScape, iNet rūpnīca: com.jscape.inet.ftp.Ftp
  2. / n programmatūra, IP * darbojas: ipworks.Ftp
  3. Uzņēmumu izplatītās tehnoloģijas, Java FTP klientu bibliotēka: com.enterprisedt.net.ftp.FTPClient
  4. IBM alphaWorks, FTP pupiņu komplekts: com.ibm.network.ftp.protocol.FTPProtocol
  5. SourceForge, JFtp: net.sf.jftp.net.FtpConnection
  6. Džakartas projekts, Jakarta Commons / Net: org.apache.commons.net.ftp.FTPClient
  7. JavaShop JNetBeans: jshop.jnet.FTPClient
  8. Saule, JDK: sun.net.ftp.FtpClient
  9. Florents Kueto, JavaFTP API: com.cqs.ftp.FTP
  10. Bea Petrovicova, jFTP: cz.dhl.ftp.Ftp
  11. Globus projekts, Java CoG komplekts: org.globus.io.ftp.FTPClient

Piezīmes:

  • Šīs rakstīšanas laikā IBM novērtē, vai ir lietderīgi savā vietnē piedāvāt savu alphaWorks FTP Bean Suite. Pagaidām lejupielāde ir slēgta visiem lietotājiem.
  • Jakarta Commons / Net ir savarese NetComponents aizstājējs, kas vairs nav izstrādāts.
  • Šķiet, ka JavaShop JNetBeans ir pamests. Šīs rakstīšanas laikā vietne ir bijusi bezsaistē vairāk nekā mēnesi, un es nekad nesaņēmu atbildes uz saviem atbalsta pieprasījumiem.

Kritēriji

Līdz šim esmu iepazīstinājis ar kontekstu un uzskaitījis pieejamās bibliotēkas. Tagad es uzskaita attiecīgos kritērijus, pēc kuriem tiks vērtēta katra bibliotēka. Es uzskaita iespējamās vērtības katram kritērijam kopā ar saīsinājumu ( treknrakstā), ko izmanto galīgajā salīdzināšanas matricā.

Produktu atbalsts

Bibliotēkas lietotājiem nodrošina atbalstu, izmantojot produkta dokumentāciju, apkopotus Javadocs, koda paraugus un lietojumprogrammas piemēru, kas var ietvert komentārus un paskaidrojumus. Papildu atbalstu lietotājiem var piedāvāt, izmantojot forumus, adresātu sarakstus, kontakta e-pasta adresi vai tiešsaistes kļūdu izsekošanas sistēmu. / n programmatūra piedāvā plašu atbalstu par papildu samaksu.

Atbalsta administratora motivācija ir svarīgs faktors ātram atbalstam. Atbalsta administratori var būt:

  • Brīvprātīga persona (Es)
  • Brīvprātīga grupa (G)
  • Profesionāla vienība, kas samaksāta par atbalsta sniegšanu (P)

Licence

Komerciālajos projektos produkta licence ir svarīgs jautājums, kas jāapsver no paša sākuma. Dažas bibliotēkas var brīvi pārdalīt komerciālos produktos, bet citas - ne. Piemēram, GPL (GNU General Public License) ir stingra, ierobežojoša licence, savukārt Apache programmatūras licencei ir jāpiemin tikai pārdalītajos produktos.

Komerciālās licences ierobežo izstrādes darbstaciju skaitu, kas programmējas ar bibliotēku, taču pašas bibliotēkas izplatīšana nav ierobežota.

Nekomerciāliem projektiem licence ir vairāk filozofijas jautājums; bezmaksas produkts ir jūtams.

Licences var būt:

  • Komerciāla (C)
  • GPL (G)
  • Bezmaksas (F); tomēr pārbaudiet bezmaksas licences ierobežojumus

Daži bibliotēku nodrošinātāji pēc pieprasījuma nodrošina alternatīvas, mazāk ierobežojošas licences.

Ievadīts pirmkods

Slēgta avota melnās kastes programmatūras bibliotēka var kairināt. Avota koda lietošana var būt ērtāka šādu iemeslu dēļ:

  • Atkļūdojot lietojumprogrammas koda izpildi, ievadīšana bibliotēkas koda avotā var palīdzēt izprast bibliotēkas rīcību
  • Avota kodā ir noderīgi komentāri
  • Pirmkodu var ātri pielāgot, lai tas atbilstu īpašajām vajadzībām
  • Parauga avota kods var būt iedvesmojošs

Vecums

Bibliotēkas ir pārbaudītas, atkļūdotas un atbalstītas kopš to pirmās publiskās izlaišanas. Tā kā versiju numerācija dažādās bibliotēkās atšķiras, es šo kritēriju balstu uz agrākās publiskās izlaišanas gadu.

Direktoriju sarakstu atbalsts

Attālā faila informācijas (nosaukums, izmērs, datums) iegūšana no servera ir svarīga lielākajā daļā lietojumprogrammu. FTP protokols piedāvā NLST komandu iegūt tikai failu nosaukumus; NLST komanda ir skaidri izstrādāta tā, lai tās varētu izmantot programmas. The SARAKSTS komanda piedāvā vairāk informācijas par failu; kā atzīmē RFC959, "Tā kā informācija failā dažādās sistēmās var būt ļoti atšķirīga, šo informāciju var būt grūti automātiski izmantot programmā, taču tā var būt diezgan noderīga lietotājiem. Neviena cita standarta metode neizgūst informāciju par failu; tāpēc klientu bibliotēkas mēģina izmantot SARAKSTS atbildi. Bet tas nav viegls uzdevums: tā kā nav pieejams autoritatīvs ieteikums SARAKSTS atbildes formātu, FTP serveri ir pieņēmuši dažādus formātus:

  • Unix stils: drwxr-xr-x 1 user01 ftp 512 29. janvāris 23:32 prog
  • Alternatīvs Unix stils: drwxr-xr-x 1 user01 ftp 512 1997. gada 29. janvāris prog
  • Alternatīvs Unix stils: drwxr-xr-x 1 1 1 512 29. janvāris 23:32 prog
  • Simboliska saite Unix stilā: lrwxr-xr-x 1 user01 ftp 512 29. janvāris 23:32 prog -> prog2000
  • Dīvains Unix stils (starp lietotāju un grupu nav vietas): drwxr-xr-x 1 usernameftp 512 29. janvāris 23:32 prog
  • MS-DOS stils: 01-29-97 23:32 prog
  • Macintosh stils: drwxr-xr-x mape 29. janvāris 23:32 prog
  • OS / 2 stils: 0 REŽS 01-29-97 23:32 PROG

Unix stils, pēc tam MS-DOS stils, ir visizplatītākie formāti.

Java FTP klientu bibliotēkas mēģina izprast un automātiski noteikt pēc iespējas vairāk formātu. Turklāt tie piedāvā dažādas alternatīvas negaidītu formātu atbilžu apstrādei:

  • Papildu metode, kas atgriež neapstrādātu FTP atbildi kā vienu virkni (S)
  • Papildu metode, kas atgriež neapstrādātu virkņu kolekciju, pa vienai virknei katrā rindā / failā (C)
  • Sistēma, kas atbalsta iespraužamus parsētājus (P)

Lielākā daļa bibliotēku parsējas SARAKSTS atbildes un strukturētu neapstrādātu failu informāciju Java objektos. Piemēram, izmantojot JScape iNet Factory, šāds kods izgūst un izmanto direktoriju sarakstā saņemto informāciju par failiem:

java.util.Enumeration files = ftpClient.getDirListing (); while (faili.hasMoreElements ()) {FtpFile ftpFile = (FtpFile) faili.nextElement (); System.out.println (ftpFile.getFilename ()); System.out.println (ftpFile.getFilesize ()); // uc citas noderīgas metodes ir detalizēti aprakstītas Javadoc} 

Sadaļā "Atlikušo problēmu risinājumi" sīkāk apskatīti direktoriju saraksti.

Laika zīmoga izguve

Daudzos gadījumos mūs interesē attālā faila jaunākās modifikācijas laika zīmogs. Diemžēl neviena RFC neievieš standarta FTP komandu, lai izgūtu šo informāciju. Pastāv divas de facto metodes:

  1. Iegūstiet šo informāciju no SARAKSTS atbildi, parsējot servera atbildi. Diemžēl, kā jūs uzzinājāt iepriekšējā sadaļā, SARAKSTS atbilde FTP serveros ir atšķirīga, un informācija par laika zīmogu dažreiz ir nepilnīga. Unix formātā neprecizitāte rodas, ja attālajam failam ir vairāk nekā viens gads: tiek norādīts tikai datums un gads, bet nav norādītas stundas vai minūtes.
  2. Izmantojiet nestandarta MDTM komandu, kas īpaši izgūst attālā faila pēdējās modifikācijas laika zīmogu. Diemžēl ne visi FTP serveri īsteno šo komandu.

Sarežģīta alternatīva MDTM komandas atbalsts ir nosūtīt neapstrādātu MDTM komandu un parsējiet atbildi. Lielākā daļa bibliotēku nodrošina neapstrādātas FTP komandas nosūtīšanas metodi, piemēram:

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

Vēl viena iespējama problēma ir tā, ka FTP serveri atgriež informāciju par laiku GMT (Greenwich Mean Time). Ja servera laika josla ir zināma, izņemot FTP sakarus, java.util.TimeZone.getOffset () metode var palīdzēt pielāgot datumu starp laika joslām. Papildinformāciju par šo metodi skatiet JDK dokumentācijā.

Sadaļā "Atlikušo problēmu risinājumi" sīkāk aplūkots faila laika zīmoga iegūšana.

Ugunsmūri

Parasti ugunsmūris tiek novietots starp privāta uzņēmuma tīklu un publisku tīklu, piemēram, internetu. Piekļuve tiek pārvaldīta no privātā tīkla publiskajam tīklam, bet piekļuve no publiskā tīkla tiek liegta privātajam tīklam.

Zeķes ir publiski pieejams protokols, kas izstrādāts lietošanai kā ugunsmūra vārteja internetam. JDK atbalsta Socks 4 un Socks 5 starpniekserverus, kurus var kontrolēt dažas bibliotēkas. Kā alternatīvu JVM komandrindā var iestatīt Socks starpniekservera parametrus: java -DsocksProxyPort = 1080 -DsocksProxyHost = socks.foo.com -Djava.net.socks.username = user01 -Djava.net.socks.password = pass1234 ...

Vēl viena izplatīta alternatīva Socks starpniekservera atbalstam ir klienta mašīnā esošā TCP / IP slāņa "soksifikācija". Tāds produkts kā Kolibri var paveikt šo darbu.

JDK atbalsta arī HTTP tuneļus. Šie plaši izplatītie starpnieki neļauj augšupielādēt FTP. / n programmatūras IP * Works ļauj iestatīt HTTP tuneļa parametrus.

Lielākā daļa bibliotēku atbalsta gan aktīvos, gan pasīvos savienojumus: pasīvais savienojums ir noderīgs, ja klients atrodas aiz ugunsmūra, kas kavē ienākošos savienojumus ar augstākiem portiem. RFC1579 sīkāk aplūko šo ugunsmūrim draudzīgo funkcionalitāti. Dažu produktu dokumentācijā aktīvie un pasīvie savienojumi attiecas uz OSTA un PASV attiecīgi.

Paralēla pārsūtīšana

Darbvirsmas lietojumprogrammā, kad pārsūtīšana sākas galvenajā atsevišķajā pavedienā, viss sasalst. Dažas bibliotēkas automātiski apkalpo notikumu loku paralēlām pārsūtīšanai atsevišķos pavedienos, tāpēc mums nav jāizveido un jāpārvalda savi pavedieni.

JavaBean specifikāciju atbalsts

Dažās bibliotēkās tiek ieviesta JavaBean specifikācija. JavaBean atbilstība ļauj vizuāli programmēt, kas tiek parādīts lielākajos Java IDE.

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