1. مشكلتان رئيسيتان في برمجة الشبكة
أحدهما هو كيفية تحديد موقع واحد أو أكثر من المضيف على الشبكة ، والآخر هو كيفية نقل البيانات بشكل موثوق وكفاءة بعد العثور على المضيف.
في بروتوكول TCP/IP ، تكون طبقة IP مسؤولة بشكل أساسي عن موقع مضيف الشبكة وتوجيه نقل البيانات. يمكن أن يحدد عنوان IP بشكل فريد مضيف على الإنترنت.
توفر طبقة TCP آلية نقل بيانات موثوقة (TCP) أو غير موثوقة (UDP) للتطبيق ، وهي الكائن الرئيسي لبرمجة الشبكة ، ولا يحتاج عمومًا إلى الاهتمام بكيفية معالجة طبقة IP بيانات.
نموذج برمجة الشبكة الأكثر شعبية في الوقت الحالي هو بنية العميل/الخادم (C/S). أي أن أحد أطراف الاتصالات يعمل كخادم لانتظار العميل لتقديم طلب والرد. ينطبق العميل على الخادم عند الحاجة إلى الخدمة. يتم تشغيل الخادم عمومًا دائمًا كخفي ، ويستمع إلى منفذ الشبكة. بمجرد أن يطلب العميل ذلك ، سيبدأ عملية خدمة للرد على العميل ، وفي الوقت نفسه يواصل الاستماع إلى منفذ الخدمة نفسه حتى يتمكن العملاء لاحقًا من الحصول على الخدمة في الوقت المناسب.
2. نوعان من بروتوكولات الإرسال: TCP ؛ UDP
TCP هو اختصار Tranfer Control Protocol ، وهو بروتوكول موجه نحو الاتصال يضمن انتقالًا موثوقًا به. يؤدي النقل من خلال بروتوكول TCP إلى ترتيب تدفقات بيانات خالية من الأخطاء. يجب إنشاء اتصال بين زوجين من مآخذ المرسل والمستقبل من أجل التواصل على أساس بروتوكول TCP. عندما ينتظر أحد المقبس (عادةً مقبس الخادم) إنشاء اتصال ، يمكن أن يتطلب المقبس الآخر اتصالًا. بمجرد توصيل هذين المآخذ ، يمكنهما إجراء نقل بيانات ثنائي الاتجاه ، ويمكن كلا الطرفين إجراء عمليات إرسال أو استلام.
UDP هو اختصار User Datagram Protocol . إنه بروتوكول بدون اتصال. كل بيانات بيانات هي معلومات مستقلة ، بما في ذلك عنوان مصدر أو وجهة كاملة. ينتقل إلى الوجهة على الشبكة بأي مسار ممكن. لذلك ، ما إذا كان يمكن أن تصل إلى الوجهة ، والوقت للوصول إلى الوجهة ، ولا يمكن ضمان صحة المحتوى.
يقارن:
UDP:
TCP:
طلب:
3. برمجة شبكة Java المستندة إلى المقبس
1. ما هو المقبس
يدرك برنامجان على الشبكة تبادل البيانات من خلال اتصال اتصال ثنائي الاتجاه. يسمى أحد نهايات هذا الرابط ثنائي الاتجاه المقبس. عادة ما يتم استخدام المقبس للاتصال بين العملاء ومقدمي الخدمات. Socket هي واجهة برمجة شائعة جدًا لبروتوكول TCP/IP. يتم تحديد المقبس بشكل فريد بواسطة عنوان IP ورقم المنفذ.
ومع ذلك ، فإن أنواع البروتوكولات التي تدعمها المقبس ليست فقط TCP/IP ، لذلك لا يوجد اتصال ضروري بين الاثنين. في بيئة Java ، تشير Socket Programming بشكل أساسي إلى برمجة الشبكة استنادًا إلى بروتوكول TCP/IP.
2. عملية التوصيل المقبس
يستمع جانب الخادم (يستمع) ما إذا كان هناك طلب اتصال على منفذ معين. يصدر جانب العميل طلب الاتصال إلى جانب الخادم ، ويرسل جانب الخادم رسالة قبول مرة أخرى إلى جانب العميل. تم إنشاء اتصال. يمكن لكل من الخادم وجانب العميل التواصل مع بعضهما البعض من خلال الإرسال والكتابة وطرق أخرى.
بالنسبة لمقبس يعمل بكامل طاقته ، يجب أن يتضمن الهيكل الأساسي التالي ، وتشمل عملية العمل الخطوات الأربع التالية:
(1) إنشاء مقبس ؛
(2) افتح الإدخال/التدفق الخارجي المتصل بالمقبس ؛
(3) قراءة/اكتب المقبس وفقًا لبروتوكول معين ؛
(4) مقبس إغلاق. (في التطبيقات الفعلية ، لا يتم استخدام الإغلاق المعروض. على الرغم من أن العديد من المقالات توصي بذلك ، في برنامجي ، قد لا يكون له أي تأثير لأن البرنامج نفسه بسيط نسبيًا وله متطلبات منخفضة.)
3. إنشاء المقبس
المقبس (عنوان inetaddress ، منفذ int) ؛ Socket (عنوان Inetaddress ، منفذ INT ، دفق منطقي) ؛ مقبس (مضيف سلسلة ، int prot) ؛ Socket (سلسلة مضيف ، int prot ، دفق منطقي) ؛ Socket (SocketImpl Impress) Socket (مضيف سلسلة ، منفذ int ، inetaddress localaddr ، int localport) المقبس (عنوان inetaddress ، منفذ int ، inetaddress localaddr ، int localport) serversocket (int port) ؛ Serversocket (منفذ int ، int backlog) ؛ ServersOcket (منفذ int ، int backlog ، inetaddress bindaddr) حيث العنوان والمضيف والمنفذ هو عنوان IP ، اسم المضيف ورقم المنفذ للطرف الآخر في الاتصال ثنائي الاتجاه على التوالي. يشير الدفق إلى ما إذا كان المقبس عبارة عن مقبس دفق أو مقبس بيانات. يشير LocalPort إلى أن رقم منفذ المضيف المحلي و LocalAddr و Bindaddr هم عنوان الجهاز المحلي (عنوان المضيف للخدم). INSL هي فئة الوالدين للمقبس ، والتي يمكن استخدامها لإنشاء Serversocket وإنشاء مآخذ. يمثل العد الحد الأقصى لعدد الاتصالات التي يمكن أن يدعمها الخادم. على سبيل المثال: تعلم شبكة الفيديو http://www.xxspw.com client client = New Socket ("127.0.01." ، 80) ؛ Serversocket Server = New ServersOcket (80) ؛لاحظ أنه يجب أن تكون حذراً عند تحديد منفذ. يوفر كل منفذ خدمة محددة. فقط عن طريق إعطاء المنفذ الصحيح يمكن الحصول على الخدمة المقابلة. يتم حجز أرقام المنفذ من 0 ~ 1023 بواسطة النظام. على سبيل المثال ، يبلغ رقم المنفذ لخدمة HTTP 80 ، ورقم المنفذ لخدمة Telnet هو 21 ، ورقم المنفذ لخدمة FTP هو 23. لذلك ، عندما نختار رقم المنفذ ، من الأفضل اختيار رقم أكبر من 1023 لمنع النزاعات.
في حالة حدوث خطأ عند إنشاء مقبس ، سيتم إنشاء iOexception ويجب معالجته في البرنامج. لذلك عند إنشاء مقبس أو خدم ، يجب اكتشاف الاستثناءات أو إلقاؤها.
4. برنامج عميل/خادم بسيط
1. برنامج العميل
استيراد java.io.*؛ استيراد java.net.*؛ الفئة العامة TalkClient {public static void main (String args []) {try {socket socket = new Socket ("127.0.0.1" ، 4700) ؛ // إرسال طلب عميل إلى منفذ 4700 من الجهاز Bufferreader Sin = جديد BufferedReader (New InportStreamReader (System.in)) ؛ // إنشاء كائن BufferredReader من جهاز الإدخال القياسي للمنظم printWriter OS = New PrintWriter (Socket.getOutputStream ()) ؛ // احصل على دفق الإخراج من كائن المقبس وقم بإنشاء كائن printwriter bufferreader هو = جديد bufferedReader (inputstreamreader جديد (socket.getInputStream ())) ؛ // احصل على دفق الإدخال من كائن المقبس وقم ببناء سلسلة كائن BufferredReader المقابلة ؛ readline = sin.ReadLine () ؛ // اقرأ سلسلة من الإدخال القياسي للنظام بينما (! readline.equals ("bye")) {// إذا كانت السلسلة قراءة من الإدخال القياسي هي "bye" ، أوقف حلقة OS.Println (readline) ؛ // إخراج القراءة من الإدخال القياسي للنظام إلى server os.flush () ؛ // قم بتحديث دفق الإخراج بحيث يستقبل الخادم على الفور system.out.println ("العميل:"+readline) ؛ // print the read string system.out.println ("server:"+iS.ReadLine ()) ؛ // اقرأ سلسلة من الخادم وطباعتها إلى خط القراءة القياسي = sin.ReadLine () ؛ // اقرأ سلسلة من إدخال النظام القياسي} // متابعة loop os.close () ؛ // إغلاق دفق إخراج المقبس IS.Close () ؛ // إغلاق مقبس دفق دفق الإدخال. cclose () ؛ // Close Socket} catch (استثناء e) {system.out.println ("error"+e) ؛ // حدوث خطأ ، تتم طباعة رسالة خطأ}}}}2. برنامج جانب الخادم
استيراد java.io.*؛ استيراد java.net.*؛ استيراد java.applet.applet ؛ الطبقة العامة Talkserver {public static void main (string args []) {try {serversocket server = null ؛ حاول {server = new ServersOcket (4700) ؛ // قم بإنشاء ServersoCkE للاستماع إلى طلبات العملاء على المنفذ 4700} catch (استثناء e) {system.out.println ("لا يمكن الاستماع إلى:"+e) ؛ // خطأ ، طباعة رسالة خطأ} مقبس المقبس = null ؛ حاول {socket = server.accept () ؛ // استخدم قبول () لمنع وانتظار طلب العميل. إذا جاء عميل // بعد الطلب ، يتم إنشاء كائن مقبس ويستمر في تنفيذ} catch (استثناء e) {system.out.println ("خطأ."+e) ؛ // حدوث خطأ ، تتم طباعة معلومات الخطأ طباعة} خط السلسلة ؛ BufferedReader هو = جديد BufferEdReader (inputStreamReader جديد (socket.getInputStream ())) ؛ // احصل على دفق الإدخال من كائن المقبس وقم بإنشاء كائن BufferredReader المقابل OS = NewPrintWriter (Socket.getOutputStream ()) ؛ // احصل على دفق الإخراج من كائن المقبس وقم بإنشاء كائن printwriter bufferrederer sin = جديد bufferedReader (inputStreamReader جديد (System.in)) ؛ // إنشاء نظام كائن BufferreadReader // طباعة السلسلة قراءة من العميل على خط الإخراج القياسي = sin.ReadLine () ؛ // اقرأ سلسلة من الإدخال القياسي بينما (! line.equals ("bye")) {// إذا كانت السلسلة "وداعًا" ، فوقف حلقة OS.Println (السطر) ؛ // إخراج السلسلة os.flush () للعميل ؛ // قم بتحديث دفق الإخراج بحيث يتلقى العميل على الفور system.out.println ("Server:"+line) ؛ // print the read string system.out.println ("client:"+iS.ReadLine ()) ؛ // اقرأ سلسلة من العميل وطباعتها إلى خط الإخراج القياسي = sin.ReadLine () ؛ // اقرأ سلسلة من إدخال النظام القياسي} // متابعة loop os.close () ؛ // إغلاق دفق إخراج المقبس IS.Close () ؛ // إغلاق مقبس دفق دفق الإدخال. cclose () ؛ // إغلاق Socket Server.close () ؛ // أغلق ServersOcket} catch (استثناء e) {system.out.println ("error:"+e) ؛ // حدث خطأ ، طباعة رسالة خطأ}}}5. دعم برنامج العميل/الخادم متعدد الرفع
يمكن لبرنامج العميل/الخادم السابق تطبيق المحادثات بين الخادم والعميل واحد فقط. في التطبيقات الفعلية ، غالبًا ما يتم تشغيل برنامج دائم على الخادم ، والذي يمكنه تلقي طلبات من عملاء آخرين متعددين وتوفير الخدمات المقابلة. من أجل إدراك وظيفة توفير الخدمات لعدة عملاء على الخادم ، يجب تحويل البرنامج أعلاه وتنفيذ آلية الرئاسة المتعددة. يستمع الخادم دائمًا إلى ما إذا كانت هناك طلبات عميل على المنفذ المحدد. بمجرد سماع طلب العميل ، سيبدأ الخادم مؤشر ترابط خدمة خاص للرد على طلب العميل. يدخل الخادم نفسه على الفور حالة الاستماع بعد بدء تشغيل الموضوع ، في انتظار وصول العميل التالي.