بازنگري‌ كتابخانه‌هاي‌ كلاينت JavaFTP

 

نويسنده: Jean Pierre Norguet

مترجم: شهناز پيروزفر

 

چكيده

اين‌ مقاله، كدنويسي‌ كلاينت FTP را با كمك‌ كتابخانه‌هاي‌ موجود جاوا توضيح‌ مي‌دهد و فهرستي‌ از كتابخانه‌هاي FTP را مقايسه‌ مي‌كند. بدين‌ترتيب‌ مي‌توان‌ كتابخانه‌ها را مطابق‌ با نياز گزينش‌ نمود. اجازه‌ دهيد وضعيتي‌ را در نظر بگيريم‌ كه‌ در آن، هدف‌ نوشتن‌ يك‌ برنامه‌ كاربردي‌ جاواست‌ كه‌ بايد فايلهايي‌ را از كامپيوتر راه‌ دوري‌ كه‌ سرور FTP را اجرا مي‌كند، download نمايد. همچنين‌ مي‌خواهيم downloadها را مبتني‌ بر اطلاعاتي‌ نظير تاريخ‌ يا اندازه‌، فيلتر نماييم.

گرچه‌ ممكن‌ است‌ اين‌ كار ساده‌ به‌ نظر برسد، اما انجام‌ آن‌ دشوار، طولاني‌ و تا حدي‌ خطرناك‌ است. لذا ترجيح‌ مي‌دهيم‌ از جز نرم‌افزاري‌ موجود و كتابخانه‌هايي‌ كه‌ بر روي وب موجودند، استفاده‌ كنيم. download مايل‌ با كمك‌ كتابخانه‌ كلاينت FTP به‌ صورت‌ زير خواهد بود:

 

FTPClient ftpClient = new FTPClient();
ftpClient.connect("ftp.foo.com", "user01", "pass1234");
ftpClient.download("C:\\Temp\\", "README.txt");
// Eventually other operations here ...
ftpClient.disconnect();

 

ارزيابي‌ كيفيت‌ كتابخانه‌ كلاينت FTP كه‌ نيازهايمان‌ را برآورده‌ سازد، آنگونه‌ كه‌ به‌ نظر مي‌رسد، ساده‌ نيست. بدين‌ منظور بايد زماني‌ صرف‌ يافتن‌ كتابخانه‌ كلاينت FTP نماييم. سپس‌، پس‌ از آنكه‌ همه‌ كتابخانه‌هاي‌ موجود را يافتيم، كداميك‌ را برگزينيم؟ هر كتابخانه‌ نيازهاي‌ متفاوتي‌ را برآورده‌ مي‌سازد. كيفيت‌ كتابخانه‌ها يكسان‌ نيست‌ و طراحي هر يك‌ با ديگري‌ تفاوت‌ دارد. هر كتابخانه‌ مجموعه‌ متفاوتي‌ از گونه‌ها را عرضه‌ مي‌نمايد. لذا، ارزيابي‌ و مقايسه‌ كتابخانه‌هاي‌ كلاينت FTP مي‌تواند دشوار و توام‌ با دردسر باشد. اين‌ مقاله‌ سعي‌ دارد فرايند انتخاب‌ يك‌ كتابخانه FTP مناسب‌ را كوتاه، آسان‌ و ارزشمند سازد. من‌ ابتدا تمام‌ كتابخانه‌هاي‌ كلاينت FTP موجود را فهرست‌ مي‌نمايم. سپس‌ شاخص‌هاي‌ تعيين‌ كتابخانه‌ها را تعريف‌ مي‌كنم.

 

پشتيباني FTP در JDK

مشخصه‌ مرجع‌ براي FTP، (Request for Comments) RFC 959 مي‌باشد.

شركت‌ سان‌ ميكروسيستمز، پياده‌سازي RFC 959 را در JDK لحاظ‌ نموده، اما داخلي‌ فاقد مستندسازي‌ و فاقد منبع‌ است. RFC 959 پشتيبان‌ واسط‌ عمومي‌ پياده‌سازي  RF 1738 (همانگونه‌ كه‌ در شكل‌ 1 آمده‌ است) مي‌باشد.

 

شكل‌ 1. پشتيباني FTP در JDK

 

 

پياده‌سازي RFC 1738 به‌ عنوان‌ استاندارد در JDK عرضه‌ شده‌ است‌ كه‌ مسئول‌ عمليات‌ انتقال FTP است. براي‌ استفاده‌ از آن‌ كد زير را مي‌نويسيم:

 

URL url = new URL("ftp://user01:pass1234@ftp.foo.com/README.txt;type=i");
URLConnection urlc = url.openConnection();
InputStream is = urlc.getInputStream(); // To download
OutputStream os = urlc.getOutputStream(); // To upload

 

 

پشتيباني‌ كلاينت FTP در JDK از توصيه‌هاي‌ استاندارد پيروي‌ مي‌كند. اما تفاوت‌هايي‌ دارد:

·  از كتابخانه‌هاي‌ كلاينت FTP طرف‌ ثالث‌ متمايز است. اين‌ كتابخانه‌ها RFC 959 را پياده‌سازي‌ مي‌كنند نه RFC 1738 را.

·  RFC 959 در اكثر ابزارهاي‌ كلاينت FTP دسك‌تاپ‌ پياده‌سازي‌ مي‌شود. بسياري‌ از برنامه‌نويسان‌ جاوا از اين‌ ابزارها براي‌ برقراري‌ ارتباط‌ با سرورهاي FTP بهره‌ مي‌گيرند. اين‌ ابزارها كتابخانه‌هاي‌ شبيه RFC 959 را ترجيح‌ مي‌دهند.

·  كلاسهاي URL و URL Connection مسيرهاي‌ ارتباطي‌ را باز مي‌كنند. كتابخانه‌ سان‌ از پاسخ‌هاي‌ سرور FTP به‌ آبجكت‌هايي‌ نظير Remote File، File، String يا Calendar پشتيباني‌ نمي‌كند. لذا بايد كد بيشتري‌ را براي‌ نوشتن‌ داده‌ها در فايل‌ بنويسيم.

·  همانگونه‌ كه‌ در بخش‌ 3.2.5 Optimization RFC 1738 آمده‌ است، FTP URL بايد ارتباط‌ (كنترل) را پس‌ از هر عمليات‌ مسدود نمايد.

·  اين‌ عمل‌ موجب‌ اتلاف‌ وقت‌ مي‌شود و براي‌ انتقال‌ فايلهاي‌ كوچك، كارآيي‌ ندارد. بعلاوه‌ محدوديت‌هاي‌ سرورهاي FTP نظير سربار ارتباط‌ به‌ دليل‌ حمله‌ به‌ شبكه‌ نيز بايد مورد بررسي‌ قرار گيرد.

·  سرانجام، فاقد قابليت‌هاي‌ سودمند است.

به‌ همين‌ دليل، استفاده‌ از كتابخانه‌ طرف‌ ثالث‌ توصيه‌ مي‌گردد. بخش‌ بعد چنين‌ كتابخانه‌هايي‌ را فهرست‌ مي‌نمايد.

 

مقايسه‌ كتابخانه‌

فهرست‌ زير حاوي‌ كتابخانه‌هايي‌ است‌ كه‌ در سراسر اين‌ مقاله‌ مقايسه‌ نمودم. اين‌ كتابخانه‌ها از مشخصه‌ مرجع FTP تبعيت‌ مي‌كند.

 

  1. JScape, iNet Factory: com.jscape.inet.ftp.Ftp
  2. /n software, IP*Works: ipworks.Ftp
  3. Enterprise Distributed Technologies, Java FTP Client Library: 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. The Jakarta Project, Jakarta Commons/Net: org.apache.commons.net.ftp.FTPClient
  7. JavaShop JNetBeans: jshop.jnet.FTPClient
  8. Sun, JDK: sun.net.ftp.FtpClient
  9. Florent Cueto, JavaFTP API: com.cqs.ftp.FTP
  10. Bea Petrovicova, jFTP: cz.dhl.ftp.Ftp
  11. The Globus Project, Java CoG Kit: org.globus.io.ftp.FTPClient

 

تذكر

آي‌بي‌ام، FTP Bean Suite را مورد ارزيابي‌ قرار مي‌دهد.

Jakarta Commons/Net جايگزين Savarese Net Components مي‌شود.

به‌ نظر مي‌رسد كه‌ استفاده‌ از Java Shop JNetBeans متوقف‌ گردد.

 

شاخص‌

در بخش‌ پيشين‌ كتابخانه‌هاي‌ موجود فهرست‌ گرديدند. اينك‌ شاخص‌هايي‌ را براي‌ ارزيابي‌ هر كتابخانه‌ معرفي‌ مي‌نمايم‌ و به‌ هر شاخص‌ مقاديري‌ را اختصاص‌ مي‌دهم.

 

پشتيباني‌ محصول

كتابخانه‌ها مستندسازي‌ محصول، Javadocs كامپايل‌ شده، كد نمونه‌ و يك‌ برنامه‌ كاربردي‌ نمونه‌ را به‌ همراه‌ توضيحات‌ مربوطه، از كاربران‌ پشتيباني‌ مي‌نمايند.

انگيزه‌ راهبران‌ پشتيباني، عامل‌ مهمي‌ براي‌ پشتيباني‌ سريع‌ است. اين‌ راهبران‌ مي‌توانند:

·   فرد داوطلب (I)

·   گروه‌ داوطلب (G)

·   متخصص (P)

باشند.

 

گواهينامه‌ (ليسانس)

گواهينامه‌ محصول‌ براي‌ پروژه‌هاي‌ تجاري‌ حائزاهميت‌ است. برخي‌ از كتابخانه‌ها قابل‌ توزيع‌ مجدد به‌ صورت‌ رايگان‌ در محصولات‌ تجاري‌ هستند و بعضي‌ اين‌ ويژگي‌ را ندارند.

گواهينامه‌هاي‌ تجاري‌ امكان‌ برنامه‌نويسي‌ توسعه‌ ايستگاههاي‌ كاري‌ را با كتابخانه‌ محدود مي‌سازند، اما توزيع‌ كتابخانه‌ به‌ تنهايي، محدود نمي‌شود.

گواهينامه‌ها مي‌توانند

·   تجاري (C)

·   (G) GPL يا (GNU General Public License)

·   مجاني (F)؛

باشند.

 

كد اصلي‌

وجود كد اصلي‌ به‌ دلايل‌ زير مناسب‌ است:

·   هنگام‌ ديباگ‌ اجراي‌ كد برنامه‌ كاربردي، استفاده‌ از كد كتابخانه‌ به‌ شما كمك‌ مي‌كند تا رفتار كتابخانه‌ را درك‌ نماييد.

·   كد اصلي، توضيحات‌ سودمندي‌ دارد.

·   كد اصلي‌ را مي‌توان‌ با نيازها تغيير داد.

·   كد اصلي‌ مي‌تواند الهام‌ بخش‌ باشد.

كتابخانه‌ها پس‌ از اولين‌ انتشار، تست، ديباگ‌ و پشتيباني‌ مي‌شوند و در نسخه‌هاي‌ متعدد عرضه‌ خواهند شد.

 

پشتيباني‌ فهرست‌ دايركتوري‌

بازيابي‌ اطلاعات‌ فايل‌ راه‌ دور (نام، اندازه، تاريخ) از سرور، براي‌ اكثر برنامه‌هاي‌ كاربردي‌ حائزاهميت‌ است. پروتكل FTP فرمان NLST را براي‌ بازيابي‌ اسامي‌ فايل‌ در نظر مي‌گيرد. اين‌ فرمان‌ حاوي‌ اطلاعات‌ ديگري‌ نيز مي‌باشد. از آن‌ جايي‌ كه‌ اطلاعات‌ فايل‌ ممكن‌ است‌ از سيستمي‌ به‌ سيستم‌ ديگر متفاوت‌ باشد، شايد استفاده‌ خودكار از آن‌ در برنامه‌ دشوار به‌ نظر برسد، اما براي‌ كاربر مفيد خواهد بود. روش‌ استاندارد ديگري‌ براي‌ بازيابي‌ فايل‌ وجود ندارد، بنابراين، كتابخانه‌هاي‌ كلاينت‌ سعي‌ دارند از پاسخ LIST استفاده‌ نمايند. اما اين‌ كار ساده‌اي‌ نيست، زيرا فرمت‌ پاسخ LIST براي‌ سرورهاي FTP مي‌تواند به‌ اشكال‌ زير باشد:

·       Unix style: drwxr-xr-x 1 user01 ftp 512 Jan 29 23:32 prog

·       Alternate Unix style: drwxr-xr-x 1 user01 ftp 512 Jan 29 1997 prog

·       Alternate Unix style: drwxr-xr-x 1 1 1 512 Jan 29 23:32 prog

·       A symbolic link in Unix style: lrwxr-xr-x 1 user01 ftp 512 Jan 29 23:32 prog -> prog2000

·       Weird Unix style (no space between user and group): drwxr-xr-x 1 usernameftp 512 Jan 29 23:32 prog

·       MS-DOS style: 01-29-97 11:32PM <DIR> prog

·       Macintosh style: drwxr-xr-x folder 0 Jan 29 23:32 prog

·       OS/2 style: 0 DIR 01-29-97 23:32 PROG

 

فرمت‌هاي‌ سبك‌ يونيكس‌ و داس‌ متداول‌ترين‌ فرمت‌ها هستند.

كتابخانه‌هاي‌ كلاينت FTP جاوا سعي‌ مي‌كنند تا بسياري‌ از فرمت‌ها را به‌ صورت‌ خودكار تشخيص‌ دهند. به‌ علاوه، اين‌ كتابخانه‌ها گزينه‌هاي‌ مختلفي‌ را براي‌ سروكار داشتن‌ با پاسخ‌هاي‌ غيرمنتظره‌ فرمت، عرضه‌ مي‌نمايند:

·   يك‌ متد اضافي‌ پاسخ‌ خام FTP را به‌ صورت‌ رشته، بازمي‌گرداند (S)

·   يك‌ متد اضافي‌ مجموعه‌اي‌ از رشته‌هاي‌ خام‌ را به‌ صورت‌ يك‌ رشته‌ در هر خط‌ / فايل‌ بازمي‌گراند (C)

·   چهارچوبي‌ كه‌ از مفسرهاي (Plug parser پشتيباني‌ مي‌كند (P)

اكثر كتابخانه‌ها تفسير (parse) پاسخ‌هاي LIST را انجام‌ مي‌دهند. براي‌ مثال، كد زير با كمك JScape INet Factory، اطلاعات‌ فايل‌ را بازيابي‌ مي‌كند:

 

java.util.Enumeration files = ftpClient.getDirListing();
while (files.hasMoreElements()) {
   FtpFile ftpFile = (FtpFile) files.nextElement();
   System.out.println(ftpFile.getFilename());
   System.out.println(ftpFile.getFilesize());
   // etc. other helpful methods are detailed in Javadoc
}

 

بازيابي Time Stamp

بسياري‌ از مواقع، زمان‌ آخرين‌ تغيير فايل‌ راه‌ دور مدنظر است. متاسفانه‌ هيچ RFC، فرمان FTP استاندارد براي‌ بازيابي‌ اين‌ اطلاعات‌ معرفي‌ نمي‌كند. دو روش‌ براي‌ انجام‌ اين‌ كار وجود دارد:

1-     بازيابي‌ اين‌ اطلاعات‌ از پاسخ LIST با Parse نمودن‌ پاسخ‌ سرور. متاسفانه‌ همانگونه‌ كه‌ در بخش‌ پيشين‌ فراگرفتيد، پاسخ LIST در سرورهاي FTP مختلف‌ و گاهي‌ اوقات‌ اطلاعات timestamp ناقص‌ است. در فرمت‌ يونيكس، هنگامي‌ كه‌ فايل‌ راه‌ دور بيش‌ از يك‌ سال‌ داشته‌ باشد، مشكل‌ پديد مي‌آيد.

2-     از فرمان MDTM براي‌ بازيابي‌هاي‌ آخرين‌ تغيير timestamp فايل‌ راه‌ دور استفاده‌ نماييد. متاسفانه‌ همه‌ سرورهاي FTP اين‌ فرمان‌ را پياده‌سازي‌ نمي‌كنند.

بدين‌ منظور يك‌ فرمان MDTM خام‌ ارسال‌ نموده‌ و پاسخ‌ را Parse كنيد. اكثر كتابخانه‌ها روشي‌ را شبيه‌ روش‌ زير براي‌ ارسال‌ فرمان FTP خام‌ فراهم‌ مي‌آورند:

 

String timestamp String = ftp Client. command ("MDTM README.txt")

 

مسئله‌ ديگر اينست‌ كه‌ سرورهاي FTP اطلاعات‌ زمان‌ را به‌ صورت (Greenwich Mean Time) GMT باز مي‌گرانند. اگر time  zone (محدوده‌ زماني) سرور با ارتباطات FTP متفاوت‌ باشد، متد Java.util.TimeZone.getoff set() مي‌تواند براي‌ تنظيم‌ زمان‌ بين oneztime ها بكار رود. براي‌ كسب‌ اطلاعات‌ بيشتر درباره‌ اين‌ روش‌ به‌ مستندات JDK مراجعه‌ نماييد.

 

فايروالها

فايروال‌ بين‌ شبكه‌ خصوصي‌ سازمان‌ و يك‌ شبكه‌ عمومي‌ نظير اينترنت‌ قرار مي‌گيرد. دستيابي‌ از طريق‌ شبكه‌ خصوصي‌ به‌ شبكه‌ عمومي‌ مديريت‌ مي‌شود، اما دستيابي‌ از شبكه‌ عمومي‌ به‌ شبكه‌ خصوصي‌ امكان‌پذير نيست.

Socks پروتكلي‌ است‌ كه‌ به‌ عنوان‌ گيت‌ وي‌ فايروال‌ براي‌ اينترنت‌ بكار مي‌رود.

JDK از پراكسي‌هاي Socks 4 ، Socks 5  پشتيباني‌ مي‌كند. خط‌ فرمان JVM مي‌تواند پارامترهاي‌ پراكسي Socks را تنظيم‌ نمايد:

 

Java – Dsocks Proxy Port = 1080 – Dsocks Proxy Host = Socks.foo.com – Djava.net.Socks. Username=userol – Djava.net.socks. password=pass 1234

 

راه‌ ديگر براي‌ پشتيباني‌ از پراكسي Stocks، Socksify نمودن‌ لايه‌ زيربنايي TCP/IP بر روي‌ ماشين‌ كلاينت‌ است. محصولي‌ نظير Hummingbird اين‌ كار را انجام‌ مي‌دهد.

JDK از كانالهاي HTTP نيز پشتيباني‌ مي‌كند. اين‌ پراكسي‌ها امكان FTP upload را فراهم‌ نمي‌آورند. /n software's IP Works به‌ شما امكان‌ مي‌دهد تا پارامترهاي‌ كانال HTTP را تنظيم‌ نماييد.

اكثر كتابخانه‌ها از ارتباطات‌ فعال‌ و غيرفعال‌ پشتيباني‌ مي‌نمايند: ارتباط‌ غيرفعال‌ هنگامي‌ سودمند است‌ كه‌ كلاينت‌ در پشت‌ فايروالي‌ باشد كه‌ از ورود ارتباطات‌ ما به‌ پورت‌هاي‌ بالاتر ممانعت‌ به‌ عمل‌ مي‌آورد.

RFC1579  اين‌ فايروال‌ را به‌ تفصيل‌ تشريح‌ نموده‌ است. بعضي‌ از مستندات‌ محصولات‌ كه‌ به‌ ارتباطات‌ فعال‌ و غيرفعال‌ اشاره‌ دارند، به‌ صورت‌ فرامين PORT و PASV هستند.

 

انتقال‌ موازي‌

وقتي‌ انتقال‌ در يك‌ برنامه‌ كاربردي‌ دسك‌تاپ‌ در  thread منفرد آغاز مي‌گردد، بعضي‌ از كتابخانه‌ها به‌ طور خودكار حلقه‌ رويداد را براي‌ انتقالات‌ موازي‌ در threadهاي‌ مجزا سرويس‌ مي‌دهند. لذا مجبور نيستيم threadها را بسازيم‌ و مديريت‌ نماييم.

 

پشتيباني‌ مشخصه JavaBean

بعضي‌ از كتابخانه‌ها مشخصه JavaBean را پياده‌سازي‌ مي‌نمايند. سازگاري‌ با JavaBean برنامه‌نويسي‌ ويژوال‌ را امكان‌پذير مي‌سازد.

طراحي /n Software IP works JavaBean مبتني‌ بر رويداد است‌ (براي‌ مثال‌ به‌ متد ipworks.ftp.list Directory() مراجعه‌ نماييد). گرچه‌ اين‌ طراحي‌ سنكرون‌ باقي‌ مي‌ماند و كاملا امناست. اما به‌ عقيده‌ بعضي‌ از برنامه‌نويسان‌ در برنامه‌هاي‌ كاربردي server-side معايبي‌ دارد.

 

نظارت‌ بر روند (Progress monitoring)

بعضي‌ از كتابخانه‌ها Progress monitoring را پياده‌سازي‌ مي‌نمايند. بدين‌ترتيب‌ پياده‌سازي listenerهاي‌ رويداد كه‌ روند انتقال FTP را پيگيري‌ مي‌كنند، آسان‌ خواهد بود. اين‌گونه، هنگام‌ توسعه‌ واسط‌ كاربرپسند، سودمند است.

 

انواع‌ انتقال‌

بخش RFC959 3.1.1  انواع‌ انتقالات‌ را مشخص‌ مي‌كند، دو انتقال‌ متداول‌ عبارتند از: ASCII nonprint (پيش‌فرض) و image (باينري‌ نيز ناميده‌ مي‌شود). بعضي‌ از كتابخانه‌ها مي‌توانند به‌ صورت auto mode، البته‌ با توجه‌ به‌ گستره‌ فايل، تنظيم‌ شوند. چنين‌ روشي‌ در سيستم‌هاي‌ اطلاعاتي‌ پيشرفته‌ كارآيي‌ دارد. ساير انتقالات‌ منسوخ‌ شده‌اند و كتابخانه‌هاي‌ جاوا از آنان‌ پشتيباني‌ نمي‌كنند.

 

ساير نكات‌

همه‌ كتابخانه‌هاي‌ حداقل‌ بر روي JDK 1.2.x و پس‌ از آن؛ بعضي‌ بر روي JDK 1.1.x و احتمالا 1.0.x اجرا مي‌شوند.

همه‌ كتابخانه‌ها به‌ صورت‌ جاوا هستند.

ماتريس‌ مقايسه‌ ساير شاخص‌ها را فهرست‌ مي‌نمايد.

كتابخانه‌هاي‌ كلاينت FTP جاوا: ماتريس‌ مقايسه‌

اين‌ ماتريس‌ كتابخانه‌ها را در بالا و شاخص‌ را در سمت‌ چپ‌ نشان‌ مي‌دهد.

y موجود در خانه‌ها به‌ معناي Yes است.

 

ماتريس‌ مقايسه FTP

هنگام‌ انتخاب‌ كتابخانه‌ به‌ توصيه‌هاي‌ ذيل‌ توجه‌ نماييد:

·   كتابخانه‌ها Jakarta commons/Net براي‌ برنامه‌اي‌ كاربردي server-side

·   استفاده‌ از كتابخانه JScape Inet Factory ساده‌ است.

·   /n Software IP Works بخشي‌ از حجم‌ عظيمي‌ از محصولات‌ است‌ كه‌ شامل‌ پشتيباني FTP رمزگذاري‌ شده‌ مي‌باشد.

·   COG Kit جاوا Grid FTP را پياده‌سازي‌ مي‌كند (سيستم‌ نسل‌ جديد انتقال‌ فايل)

·   فعلا استفاده‌ از IBM alphaworks FTP Bean Suite و Java Shop JNet Beans توصيه‌ نمي‌شود.

شايد ساير كتابخانه‌ها نياز شما را برآورده‌ سازند. لطفا به‌ ماتريس‌ مراجعه‌ نماييد.

 

 

 

Library

JScape

iNet Factory

/n software

IP*Works

Enterprise Distributed Technologies

Java FTP Client Library

IBM alphaWorks FTP Bean Suite

SourceForge

JFtp

Jakarta

Commons/Net

JavaShop

JNetBeans

Sun

JDK

Florent Cueto

JavFTP API

Bea Petrovicova

jFTP

The Globus Project

Java CoG Kit

Evaluated version

4.2

V5

1.2.1

2.0.1

1.07

1.0.0

3.0

1.2.2

2.6

0.70

1.0a

Support:

 

 

 

 

 

 

 

 

 

 

 

Javadoc

Y

Y

Y

-

-

Y

Y

-

-

Y

Y

Sample code

Y

Y

Y

Y

Y

Y

Y

-

Y

Y

Y

Forum

-

-

-

n/a

Y

-

-

Y

-

-

-

Mailing list

-

-

-

n/a

Y

Y

-

-

-

-

Y

Email

Y

Y

Y

n/a

Y

-

-

-

Y

Y

Y

Online bug tracking system

-

Y

-

n/a

Y

Y

-

-

-

-

Y

Motivation

P

P

I

P

G

G

-

-

I

I

P

License

C

C

F

F

G

F

F

F

G

-

F

Price per developer

$399

$895

$0

n/a

$0

$0

$0

$0

$0

$0

$0

Price per site

$799

n/a

$0

n/a

$0

$0

$0

$0

$0

$0

$0

Source provided

-

-

Y

Y

Y

Y

-

-

Y

Y

Y

Age

2000

1995

2000

1998

2001

1998

n/a

1995

2001

2001

1999

Directory listing:

 

 

 

 

 

 

 

 

 

 

 

Structured file objects

Y

Y

-

Y

Y

Y

Y

-

Y

Y

Y

Date/time parsing

-

-

-

-

-

Y

-

-

Y

Y

-

Alternative

S

S

C

C

S

P

P

-

P

P

P

MDTM command

Y

-

Y

-

-

-

Y

-

-

-

Y

Socks proxy

-

Y

Y

Y

-

-

-

-

-

-

-

HTTP tunnel

-

Y

-

-

-

-

-

-

-

-

-

Active/passive connection

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Transfer:

 

 

 

 

 

 

 

 

 

 

 

Download

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Upload

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Parallel transfer

Y

Y

-

-

Y

-

-

-

Y

-

-

Progress monitoring

Y

Y

-

-

Y

-

-

-

Y

Y

Y

Multiple transfer

Y

-

-

Y

-

-

-

-

-

Y

-

Recursive transfer

-

-

-

-

Y

-

-

-

-

Y

-

ASCII/binary

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

auto. ASCII/binary

Y

-

-

-

-

-

-

-

Y

Y

-

Transfer resumption

-

Y

-

Y

Y

Y

Y

-

Y

-

Y

Between two servers

-

-

-

-

-

-

-

-

-

-

Y

JavaBean

Y

Y

-

Y

-

-

Y

-

-

-

-

Pure Java

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Java exceptions

Y

Y

Y

Y

Y

Y

Y

Y

-

Y

Y

 

Key: Product support

I: A voluntary individual

G: A voluntary group

P: A professional entity, paid to provide support

Licenses

C: Commercial

G: GPL, GNU General Public License

F: Free

Directory listing support

S: An additional method returning raw FTP response as one string

C: An additional method returning a collection of raw strings, one string per line/file

P: A framework supporting pluggable parsers

 

 

مديريت‌ تغيير

گاهي‌ اوقات‌ در انتهاي‌ پروژه، به‌ ويژه‌ هنگام‌ آزمايش، شايد مايل‌ باشيم‌ كتابخانه‌مان‌ را تغيير دهيم. چنين‌ تغييري‌ بر همه‌ كدها اثر مي‌گذارد: كلاسها كامپايل‌ انجام‌ نمي‌دهند و بعضي‌ از بخش‌هاي‌ برنامه‌ كاربردي‌ بايد ثبت‌ گردد تا با اسامي‌ مختلف‌ متدها و طراحي‌ متفاوت‌ كتابخانه‌ جديد سازگار شود.

لذا مديريت‌ چنين‌ تغييري، به‌ ويژه‌ در انتهاي‌ پروژه، دشوار است. لذا مي‌توان‌ از الگوي FaCade همانگونه‌ كه‌ در شكل‌ 2 آمده‌ است، استفاده‌ نمود.

 

شكل‌ 2. بكارگيري‌ الگوي Facade در كتابخانه FTP

 

يكي‌ از مزاياي‌ الگوي‌ مذكور براي‌ كتابخانه FTP اين‌ است‌ كه‌ مي‌توانيم‌ مقداري‌ را به‌ كتابخانه‌ بيفزاييم. براي‌ مثال، مي‌توان‌ متد Facadeي‌ نوشت‌ كه‌ درخت‌ دايركتوري‌ راه‌ دور را در فايل‌ فشرده‌ شده‌ محلي download نمايد، يا متدي‌ كه‌ هرگونه‌ اصلي‌ كه‌ در كتابخانه‌ وجود ندارد، پياده‌سازي‌ كند.

سرانجام‌ اينكه، دو كتابخانه‌ كه Signature يكساني‌ دارند، لزوما رفتار مشابهي‌ در زمان‌ اجرا نخواهند داشت. لذا تغيير وضعيت‌ از يك‌ كتابخانه‌ به‌ كتابخانه‌ ديگر مي‌تواند بر زمان‌ اجراي‌ برنامه‌ كاربردي‌ تاثير گذارد. چنين‌ تاثيري‌ خوشايند نيست، زيرا پي‌ بردن‌ به‌ تفاوت‌ در زمان‌ اجرا دشوارتر است.

 

راه‌كارهايي‌ براي‌ ساير مشكلات‌

من‌ به‌ طور مختصر در توضيحات‌ شاخص‌هاي‌ فوق، چند مساله‌ حل‌ نشده‌ را تشريح‌ نمودم. در اين‌ بخش‌ دو راه‌ كار كوتاه‌ مدت‌ و بلندمدت‌ را توضيح‌ مي‌دهم.

 

فهرست‌ دايركتوري‌

عدم‌ وجود مشخصه‌اي‌ براي‌ پاسخ LIST سبب‌ مي‌شود تا پياده‌سازي‌هاي‌ متفاوت‌ سرور FTP صورت‌ گيرد و اين‌ امر مساله‌ مهمي‌ براي‌ برنامه‌نويسان‌ كلاينت FTP است.

منشا اصلي‌ اين‌ مشكل‌ در تعريف‌ پروتكل‌ نهفته‌ است‌ و متولي‌ اين‌ امر يعني (Internet Engineering Task Force) IETF بايد مشخصه‌ ساختاري‌ پاسخ LIST را در مستندات‌ مرجع‌ جديد (RFC) لحاظ‌ نمايد.

اين‌ فرايند به‌ زمان‌ زيادي‌ نياز دارد. در حال‌ حاضر بهترين‌ راه‌ كار اين‌ است‌ كه‌ از كتابخانه‌هايي‌ استفاده‌ شود كه‌ چهارچوبي‌ براي parserهاي‌ فرمت plug ارائه‌ مي‌نمايند.

 

بازيابي timeStamp فايل‌

همانگونه‌ كه‌ پيشتر بررسي‌ شد، هيچ‌ متدي timestamp آخرين‌ تغيير فايل‌ راه‌دور را در سراسر FTP بازيابي‌ نمي‌كند. من‌ دو راه‌ كار بلندمدت‌ براي‌ انتقال timeStamp از سرور به‌ كلاينت، پيشنهاد مي‌كنم:

1- نمايش‌ دقيق‌ و كامل timeStamp در پاسخ LIST.

2- استانداردسازي‌ فرمان MDTM و پاسخ.

در هر دو راه‌كار بايد time zone سرور در ارتباطات‌ مورد بررسي‌ قرار گيرد.

منشا مشكل‌ مذكور نيز در تعريف‌ پروتكل‌ نهفته‌ است.

در حال‌ حاضر از كتابخانه‌اي‌ كه LIST parse و MDTM را انجام‌ مي‌دهد، استفاده‌ مي‌شود.

 

مديريت‌ تغيير

در بخش‌ فوق، الگوي Facade براي‌ اعمال‌ كمتر تغيير در جايگزيني‌ كتابخانه، معرفي‌ گرديد. همانگونه‌ كه‌ اشاره‌ شد، اين‌ الگو بهترين‌ راه‌كار نيست، زيرا رفتار كتابخانه‌ها، در زمان‌ اجرا بر برنامه‌ كاربردي‌ تاثير مي‌گذارد و كنترل‌ آن‌ دشوار است.

توصيه‌ من‌ اين‌ است‌ كه‌ سان API استاندارد مناسبي‌ را منتشر نمايد كه‌ در آن‌ رفتارهاي‌ متد دقيق‌ تعريف‌ شده‌ باشد. برنامه‌نويسان‌ مي‌توانند از متدهاي‌ واسط‌ استفاده‌ نمايند. بدين‌ترتيب‌ تغيير كتابخانه‌ تاثير بسيار اندكي‌ بر بقيه‌ برنامه‌ كاربردي‌ خواهد داشت. از Javamail و(Java Database Connectivity) JDBC نيز مي‌توان‌ استفاده‌ نمود.

پروژه‌ استانداردسازي Java FTP API درصدد است‌ تا كاربران، توسعه‌دهندگان‌ و تهيه‌كنندگان‌ را سازماندهي‌ نمايد و request for Enhancement را به‌ عنوان Java Specification Request معرفي‌ نمايد.

 

يافتن‌ بهترين‌ كتابخانه‌ براساس‌ نيازهايتان‌

من‌ نحوه‌ نوشتن‌ كد كلاينت FTP را به‌ زبان‌ جاوا و شاخص‌هاي‌ مهم‌ براي‌ ارزيابي‌ كتابخانه‌هاي‌ متعدد و مقايسه‌ شاخص‌ها را با كتابخانه‌ها توضيح‌ دادم. اميدوارم‌ تصميم‌گيران‌ در اين‌ مقاله‌ شاخص‌هاي‌ مفيدي‌ را براي‌ اتخاذ بهترين‌ تصميم‌ بيابند.

در پايان‌ نيز مشكلات‌ متداول‌ همه‌ كتابخانه‌هاي FTP مطرح‌ شد و راه‌كارهاي‌ كوتاه‌ مدت‌ و بلندمدت‌ براي‌ رفع‌ مشكلات‌ پيشنهاد گرديد.

 

منابع

·                   The Java FTP API standardization project homepage:
http://wasa.ulb.ac.be/thesis/ftp/Java_API.html

·                   Learn more about the Java Community Process:
http://www.jcp.org/

·                   The IETF official Website:
http://www.ietf.org/

·                   RFC959 (FTP):
http://www.ietf.org/rfc/rfc0959.txt

·                   RFC1579:
http://www.ietf.org/rfc/rfc1579.txt

·                   RFC1738 (URL):
http://www.ietf.org/rfc/rfc1738.txt

·                   RFC1928 (Socks 5):
http://www.ietf.org/rfc/rfc1928.txt

·                   Some complete and clear explanations about Socks:
http://www.socks.permeo.com/

·                   Hummingbird Socks:
http://www.hummingbird.com/products/nc/socks/

·                   Learn more about the JavaBeans component architecture:
http://java.sun.com/products/javabeans/

·                   Sun suggests commendable Java coding conventions:
http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html

·                   "Why Developers Should Not Write Programs That Call 'Sun' Packages" (Sun Microsystems, 1996):
http://java.sun.com/products/jdk/faq/faq-sun-packages.html

·                   A short overview of the Façade pattern in Java:
http://www.cs.ucsb.edu/~cappello/50/lectures/patterns/Facade.html

·                   Learn more about patterns in Java, including the Façade pattern: Patterns in Java, Volume 1, Second Edition, Mark Grand (John Wiley & Sons, 2002; ISBN 0471227293):
http://www.amazon.com/exec/obidos/ASIN/0471227293/javaworld

·                   The bible about patterns in other languages, including the Façade pattern: Design Patterns, Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, (Addison-Wesley, 1995; ISBN 0201633612):
http://www.amazon.com/exec/obidos/ASIN/0201633612/javaworld

·                   The Globus Toolkit Public License:
http://www.globus.org/toolkit/download/license.html

·                   Learn more about GridFTP:
http://www.globus.org/datagrid/gridftp.html

·                   iNet Factory, JScape:
http://www.jscape.com/inetfactory/

·                   IP*Works, /n software:
http://www.nsoftware.com/products/showprod.aspx?part=IPJ5-V

·                   Java FTP Client Library, Enterprise Distributed Technologies:
http://www.enterprisedt.com/downloads/ftp.html

·                   FTP Bean Suite, IBM alphaWorks:
http://www.alphaworks.ibm.com/alphabeans/ftp/

·                   JFtp, SourceForge:
https://sourceforge.net/projects/j-ftp/

·                   Jakarta Commons/Net, the Jakarta Project:
http://jakarta.apache.org/commons/net/

·                   JNetBeans, JavaShop:
http://www.java-shop.com/

·                   Sun FTP API:
http://forum.java.sun.com/thread.jsp?thread=217004&forum=54&message=752443

·                   JavaFTP API, Florent Cueto:
http://cqs.dyndns.org:81/javaftp/

·                   jFTP, Bea Petrovicova:
http://www.geocities.com/beapetrovicova/

·                   Java CoG Kit, the Globus Project:
http://www.globus.org/cog/java

·                   Savarese NetComponents:
http://www.savarese.org/java/index.html

·                   Jean-Pierre Norguet also authored Websphere Version 4 Application Development Handbook with Ueli Wahli, Alex Matthews, Paula Coll Lapido, Paula Call Lapido (Prentice Hall PTR, 2002; ISBN 0130092258):
http://www.amazon.com/exec/obidos/ASIN/0130092258/javaworld

 

 

Copyright 2003 IDG News Service.All right reserved.

Copyright 2003, PC World Iran, All rights reserved.