-
10.2.4.3 المثال 3: تطوير بروتوكولات طبقة تطبيقات الشبكة
مطبعة جامعة تسينغهوا "مبرمجو جافا، الأشياء التي يجب القيام بها في العمل" المؤلف: تشونغ شنغ - مقتطفات جزئية من الفصل العاشر "السيد موهوب بقدر ما هو قادر".
ربما استخدم الجميع أدوات التحميل والتنزيل عبر بروتوكول نقل الملفات (FTP)، على سبيل المثال، "LeapFTP" هي أداة تحميل وتنزيل مريحة جدًا لخادم FTP، كما هو موضح في الشكل. هذه الأداة مريحة للغاية، بعد إدخال اسم المستخدم وكلمة المرور، يمكنك رؤية قائمة الملفات على خادم FTP، مما يسهل عمليات التحميل والتنزيل.
هل سبق لك أن حاولت كتابة تطبيق تحميل وتنزيل ملف FTP بلغة Java؟
يمكن لـ Java أيضًا تطوير مثل هذا البرنامج. لنلق نظرة أولاً على كيفية تطوير تطبيق FTP باستخدام مجموعة أدوات FTP الخاصة بـ Java.
استيراد sun.net.*;
import sun.net.ftp.*;
فئة عامة FTP {
public static void main(String[] args) {
خادم السلسلة = "192.168.0.12"؛ // أدخل عنوان IP لخادم FTP
String user = "useway"؛ // اسم المستخدم لتسجيل الدخول إلى خادم FTP
String passe = " !@#$%abce "; // كلمة مرور اسم المستخدم لتسجيل الدخول إلى خادم FTP
مسار السلسلة = "/home/useway"؛ // المسار على خادم FTP
يحاول {
FtpClient ftpClient=new FtpClient(); // إنشاء كائن FtpClient
ftpClient.openServer(server); // الاتصال بخادم FTP
ftpClient.login(user,password);// قم بتسجيل الدخول إلى خادم FTP
if (path. length()!=0) ftpClient.cd(path);
TelnetInputStream is=ftpClient.list();
كثافة العمليات ج؛
بينما ((c=is.read())!=-1) {
System.out.print((شار)ج);
}
قريب () ؛
ftpClient. CloseServer();// اخرج من خادم FTP
}
قبض (استثناء على سبيل المثال) {
}
}
}
إذا كنت مهتمًا، يمكنك كتابة هذا البرنامج بنفسك. عند تشغيل هذا البرنامج، سنرى الوضع كما هو موضح في الشكل، مع سرد محتويات الدليل للبرنامج من جانب الخادم.
هذا البرنامج هو برنامج بسيط للحصول على قائمة الملفات على خادم FTP، لكن لا تفهموني خطأ، لا يمكن أن يسمى هذا البرنامج تطوير برنامج "بروتوكول طبقة تطبيق الشبكة"!
يستخدم هذا البرنامج فقط الفئات ذات الصلة في "sun.net.*;" و"sun.net.ftp.*;" لتشغيل جانب FTP. نحن لا نستخدم مقبس Java على مستوى الشبكة لمواجهة أي خادم FTP يتم إرسال الطلب إلى العميل، ولكن يتم إرسال طلب الارتباط إلى الخادم من خلال مجموعة الأدوات التي توفرها Java.
تتمثل ميزة استخدام حزمة Java FTP للاتصال بخادم FTP في أننا لا نحتاج إلى الاهتمام بالتفاصيل المحددة لإرسال البيانات على مستوى الشبكة، ولكن نحتاج فقط إلى استدعاء الطريقة المقابلة. عيب استخدام حزمة Java FTP للاتصال بخادم FTP هو أن المطورين لا يعرفون خصوصيات وعموميات إرسال واستقبال بروتوكول طبقة التطبيق، ولا يمكنهم فهم المبادئ، ولديهم فهم ضعيف جدًا للبيانات الأساسية.
في هذه المرحلة، سيتساءل بعض المبرمجين: "كيف يتفاعل بروتوكول FTP بين الكمبيوتر والخادم على مستوى الشبكة؟" حسنًا، دعني أدرج لك عملية تفاعل بروتوكول FTP.
يرجى الاطلاع على المثال التالي لتفاعل بروتوكول FTP:
خوادم FTP: 220 (vsFTPd 2.0.1)
عميل FTP: طريقة استخدام المستخدم
خادم FTP: 331 يرجى تحديد كلمة المرور.
عميل FTP: تمرير !@#$%abce
خادم FTP: 230 تم تسجيل الدخول بنجاح.
عميل FTP: CWD /home/useway
خادم FTP: تم تغيير دليل 250 بنجاح.
عميل FTP: EPSV ALL
خادم FTP: 200 EPSV، كل شيء على ما يرام.
عميل FTP: EPSV
خادم FTP: 229 الدخول في الوضع السلبي الممتد (|||62501|)
عميل FTP: القائمة
خادم FTP: 150 هنا تأتي قائمة الدليل.
خادم FTP: 226 دليل إرسال موافق.
عميل FTP: إنهاء
خادم بروتوكول نقل الملفات: 221 وداعا.
النص أعلاه هو في الواقع عملية تفاعل بين خادم FTP وعميل FTP، وبروتوكول نقل المعلومات بينهما هو بروتوكول TCP، والمحتوى المرسل لبعضهما البعض هو ما هو مكتوب في النص أعلاه.
ولنشرح معنى كل جملة خطوة بخطوة:
خادم FTP: 220 (vsFTPd 2.0.1) | الوصف: تم الارتباط بنجاح
عميل FTP: طريقة استخدام المستخدم |التعليمات: أدخل اسم المستخدم
خادم FTP: 331 الرجاء تحديد كلمة المرور |الوصف: الرجاء إدخال كلمة المرور.
عميل FTP: تمرير !@#$%abce |التعليمات: أدخل كلمة المرور
خادم FTP: 230 تم تسجيل الدخول بنجاح |.
عميل FTP: CWD /home/useway | الوصف: تبديل الدليل
خادم FTP: تم تغيير دليل 250 بنجاح |الوصف: تم تبديل الدليل بنجاح.
عميل FTP: EPSV ALL | الوصف: وضع الارتباط السلبي لـ EPSV
خادم FTP: 200 EPSV ALL موافق |
عميل FTP: EPSV | الوصف: الرابط
خادم FTP: 229 الدخول في الوضع السلبي الممتد (|||62501|) |الوصف: منفذ الارتباط السلبي هو 62501
عميل FTP: LIST |. الوصف: قم بتنفيذ LIST لعرض قائمة الملفات
خادم FTP: 150 هنا تأتي قائمة الدليل |. الوصف: يتم إرسال القائمة من المنفذ 62501
خادم FTP: دليل 226 أرسل موافق | الوصف: اكتمل الإرسال
عميل FTP: إنهاء | الوصف: قم بإنهاء FTP
خادم بروتوكول نقل الملفات: 221 وداعا |
مع محتوى النص أعلاه، يمكننا الحصول على قائمة ملفات FTP دون أي أدوات. إذا كنت لا تصدق ذلك، اتبعني وقم بذلك مرة أخرى.
الخطوة 1: قم أولاً بفتح CMD للدخول إلى وضع سطر أوامر DOS واكتب:
التلنت 192.168.0.1 21[أدخل]
الوصف: اتصال Telnet بالمنفذ 21 لخادم Ftp.
وبعد تنفيذ هذا الأمر تكون النتائج التي تم الحصول عليها كما هو موضح في الشكل.
هل وجدت أي مشاكل؟
محتوى المطالبة هو بالضبط الجملة الأولى من الفقرة أعلاه: 220 (vsFTPd 2.0.1)، مما يعني أن خادم FTP قد قبل الرابط الخاص بنا ويمكنه المتابعة إلى الخطوة التالية.
الخطوة 2: اكتب السلسلة التالية من إرسال المحتويات واحدًا تلو الآخر:
طريقة استخدام المستخدم[أدخل]
تمرير !@#$%abce [أدخل]
CWD /الصفحة الرئيسية/useway[أدخل]
EPSV الكل[أدخل]
إيبسف [أدخل]
وتظهر النتائج التي تم الحصول عليها في الشكل.
حسنًا، هذه المرة قدم خادم FTP سلسلة من الردود، وأخيرًا أعطى رقم منفذ جديد "58143".
الخطوة 3: افتح نافذة CMD جديدة واكتب:
التلنت 192.168.0.1 58143 [أدخل]
لاحظ أن رقم المنفذ الخاص بطلب Telnet للاتصال بالخادم هذه المرة هو "58143"، وهو منفذ ارتباط مقدم لنا من خادم FTP. بعد الربط، تصبح النافذة فارغة دون أي مطالبات، كما هو موضح في الشكل.
الخطوة 4: ارجع إلى نافذة CMD الأولى واكتب:
القائمة[أدخل]
الخطوة 5: في هذا الوقت، تتلقى نافذة CMD الثانية قائمة الملفات:
تستقبل النافذة الثانية قائمة الملفات كما هو موضح في الشكل.
الخطوة 6: الخروج من العملية
إنهاء[أدخل]
وبعد الانتهاء من التنفيذ، يتم فقدان الارتباط بالمضيف، كما هو موضح في الشكل.
كما ترون، يعد بروتوكول FTP بمثابة عملية تفاعلية. يمكنك أيضًا إكمال عمليات الأوامر الأساسية لـ FTP باستخدام أداة Telnet التي تأتي مع النظام. إذا كنت تريد استخدام مقبس Java لإكمال العملية المذكورة أعلاه، فما عليك سوى اتباع المحتوى أعلاه خطوة بخطوة لإرسال السلسلة إلى خادم FTP.
نعطي أيضًا رمز المثال أدناه:
استيراد java.io.InputStream؛
استيراد java.io.OutputStream؛
استيراد java.net.Socket؛
الطبقة العامة FTPClient {
public static void main(String[] args) يطرح الاستثناء {
مقبس المقبس = مقبس جديد("192.168.0.1",21);
InputStream هو = المقبس.getInputStream();
OutputStream os = المقبس.getOutputStream();
// تلقي معلومات الارتباط الأولية
بايت[] المخزن المؤقت = بايت جديد[100];
int length = is.read(buffer);
String s = new String(buffer, 0, length);
System.out.println(s);
//أرسل اسم المستخدم
String str = "طريقة استخدام المستخدمn";
os.write(str.getBytes());
// احصل على القيمة المرجعة
length = is.read(buffer);
s = سلسلة جديدة (buffer، 0، length)؛
System.out.println(s);
//أرسل كلمة المرور
str = "PASS !@#$%abcdn ";
os.write(str.getBytes());
// احصل على القيمة المرجعة
length = is.read(buffer);
s = سلسلة جديدة (buffer، 0، length)؛
System.out.println(s);
// إرسال أمر تبديل المجلد
str = "CWD /home/usewayn";
os.write(str.getBytes());
// احصل على القيمة المرجعة
length = is.read(buffer);
s = سلسلة جديدة (buffer، 0، length)؛
System.out.println(s);
//تعيين الوضع
str = "EPSV ALLn";
os.write(str.getBytes());
// احصل على القيمة المرجعة
length = is.read(buffer);
s = سلسلة جديدة (buffer، 0، length)؛
System.out.println(s);
// احصل على معلومات المراقبة السلبية
str = "EPSVn";
os.write(str.getBytes());
// احصل على القيمة المرجعة
length = is.read(buffer);
s = سلسلة جديدة (buffer، 0، length)؛
System.out.println(s);
// احصل على رقم المنفذ لمراقبة FTP السلبية
String portlist=s.substring(s.indexOf("(|||")+4,s.indexOf("|)"));
System.out.println(portlist);
// إنشاء مثيل لفئة مؤشر ترابط ShowList وربط رقم منفذ الاستماع السلبي لـ FTP
ShowList sl=new ShowList();
sl.port=Integer.parseInt(portlist);
sl.start();
// تنفيذ أمر القائمة
str = "قائمةn";
os.write(str.getBytes());
// احصل على القيمة المرجعة
length = is.read(buffer);
s = سلسلة جديدة (buffer، 0، length)؛
System.out.println(s);
//أغلق الرابط
قريب () ؛
os.Close();
المقبس. إغلاق ()؛
}
}
// احصل على فئة معلومات الارتباط السلبي، هذه الفئة متعددة الخيوط
فئة ShowList تمتد الموضوع {
منفذ int العام = 0؛
تشغيل الفراغ العام () {
يحاول{
مقبس المقبس = مقبس جديد ("192.168.0.1"، this.port)؛
InputStream هو = المقبس.getInputStream();
OutputStream os = المقبس.getOutputStream();
بايت[] المخزن المؤقت = بايت جديد[10000];
int length = is.read(buffer);
String s = new String(buffer, 0, length);
System.out.println(s);
//أغلق الرابط
قريب () ؛
os.Close();
المقبس. إغلاق ()؛
}
قبض (استثناء على سبيل المثال) {
}
}
}
نتيجة التشغيل التي تم الحصول عليها بعد تشغيل البرنامج هي في الأساس نفس تأثير التشغيل أعلاه. ماذا عن الطبقة السفلية؟ هل هي مجرد تفريغ الطرق المغلفة وتشغيلها؟ قواعد عملها، يمكننا تطوير نفس البرنامج.