تنقسم تطبيقات الشبكة إلى جزأين: العميل والخادم ، وفئة المقبس هي فئة Java مسؤولة عن معالجة اتصالات العميل. من خلال هذه الفئة ، يمكنك الاتصال بخادم باسم IP أو مجال محدد ، ويمكنك إرسال وتلقي البيانات مع بعضها البعض مع الخادم. ستتم مناقشة استخدام فئة المقبس بالتفصيل في هذه المقالة والعديد من المقالات لاحقًا ، بما في ذلك أساسيات فئة المقبس ، وطرق الاتصال المختلفة ، وطرق الحصول على وتعيين المهلة أثناء الاتصال ، واتصالات الشبكة الختامية ، إلخ.
في هذه المقالة ، سنناقش الخطوات والأساليب الأساسية لاستخدام فئة المقبس. بشكل عام ، يجب على برامج عميل الشبكة إجراء الخطوات الثلاث التالية عند الاتصال ببرامج الخدمة.
1. الاتصال بالخادم
يمكن للعميل الاتصال بالخادم بطريقتين ، أحدهما هو الاتصال بالخادم من خلال IP ، والآخر هو الاتصال بالخادم من خلال اسم المجال.
في الواقع ، هاتان الطريقتان هي في الأساس طريقة واحدة. في العميل الأساسي ، يتصلون جميعًا بالخادم من خلال IP ، ولكن هناك بعض الاختلافات بين الطريقتين. إذا كان برنامج الخادم متصلاً من خلال IP ، فإن العميل ببساطة يتصل وفقًا لـ IP. إذا كان الخادم متصلاً من خلال اسم المجال ، فيجب على العميل حل اسم المجال إلى IP من خلال DNS ، ثم قم بالاتصال وفقًا لهذا IP.
في العديد من لغات البرمجة أو أدوات التطوير (مثل C/C ++ ، Delphi) عند الاتصال بالخادم باستخدام اسم المجال ، يجب عليك أولاً حل اسم المجال إلى IP ، ثم الاتصال عبر IP. في Java ، تم تضمين وظيفة دقة اسم المجال في فئة المقبس. لذلك ، نحتاج فقط إلى استخدام اسم المجال مثل استخدام IP.
الطريقة الأكثر شيوعًا للاتصال ببرامج الخادم من خلال فئة المقبس هي تمرير اسم IP أو المجال ورقم المنفذ كمعلمات في فئة المقبس من خلال مُنشئ فئة المقبس. هناك العديد من الأشكال الزائدة من مُنشئ فئة المقبس. في هذا القسم ، تمت مناقشة واحدة فقط من النماذج الأكثر شيوعًا: المقبس العام (مضيف سلسلة ، منفذ INT). من تعريف هذا المُنشئ ، تحتاج فقط إلى تمرير اسم IP أو المجال ورقم المنفذ مباشرة في المنشئ. الرمز التالي هو برنامج مثال يتصل ببرامج الخادم:
حزمة mysocket. استيراد java.net.*؛ الفئة العامة myConnection {public static void main (string [] args) {try {if (args.length> 0) {socket socket = new Socket (args [0] ، 80) ؛ system.out.println (args [0] + "connectival bantaived!") ؛ } else system.out.println ("يرجى تحديد اسم IP أو المجال!") ؛ } catch (استثناء e) {system.err.println ("رسالة الخطأ:" + e.getMessage ()) ؛ }}} في ما سبق ، يتم تمرير اسم IP أو المجال إلى البرنامج من خلال معلمة سطر الأوامر ، ثم يتم توصيل منفذ 80 من IP أو اسم المجال المحدد من خلال معلمة سطر الأوامر من خلال Socket Socket = New Socket (Args [0] ، 80). نظرًا لأن مُنشئ فئة المقبس يستخدم رميات عند التعريف ، عند الاتصال بمنشئ فئة المقبس ، يجب عليك استخدام Try ... Catch Date لالتقاط الخطأ ، أو استخدام عبارة TROMT لرمي الخطأ للوظيفة الرئيسية.
استخدم فئة المقبس للاتصال بالخادم لتحديد المنافذ التي يتم فتحها على مضيف. الكود التالي هو برنامج يقوم بمسح المنافذ التي يتم فتحها في هذا الجهاز.
2. إرسال وتلقي البيانات
الطريقتين الأكثر أهمية في فئة المقبس هما GetInputStream و GetOutputStream. يتم استخدام هاتين الطريقتين للحصول على كائنات inputstream و outputstream لقراءة وكتابة البيانات ، على التوالي. يقرأ InputStream هنا البيانات المرسلة من قبل برنامج الخادم إلى العميل ، والمخرجات هي البيانات التي يريد العميل إرسالها إلى برنامج الخادم.
عند كتابة برامج عميل الشبكة الفعلية ، سواء كنت تستخدم getInputStream أو GetOutputStream ، ومن يجب استخدامه أولاً ومن يجب استخدامه لاحقًا بواسطة التطبيق المحدد. على سبيل المثال ، من خلال الاتصال بمنفذ 80 (عادةً ما يكون المنفذ الافتراضي الذي يستخدمه بروتوكول HTTP) لموقع Post and Telecommonications Press (www.ptpress.com.cn) ، وإرسال سلسلة ، وأخيراً قراءة المعلومات التي تم إرجاعها من www.ptpress.com.cn.
حزمة mysocket ؛ استيراد java.net.*؛ استيراد java.io.*؛ الفئة العامة myConnection2 {public static void main (string [] args) يلقي الاستثناء {socket socket = new Socket ("www.ptpress.com.cn" ، 80) ؛ // إرسال البيانات إلى برنامج الخادم OutputStream Ops = socket.getOutputStream () ؛ OutputStreamWriter OPSW = New OutputStreamWriter (OPS) ؛ BufferedWriter BW = New BufferedWriter (OPSW) ؛ BW.Write ("Hello World/R/N/R/N") ؛ bw.flush () ؛ // استقبال البيانات من برنامج الخادم inputStream IPS = socket.getInputStream () ؛ inputStreamReader IPSR = جديد inputStreamReader (IPS) ؛ BufferedReader BR = جديد BufferedReader (IPSR) ؛ سلسلة s = "" ؛ بينما ((s = br.readline ())! = null) system.out.println (s) ؛ socket.close () ؛ }} عند كتابة الرمز أعلاه ، يجب عليك الانتباه إلى النقطتين التاليتين:
1. من أجل تحسين كفاءة نقل البيانات ، لا تنقل فئة المقبس البيانات في كل مرة تسمى طريقة الكتابة ، ولكنها تكتب البيانات المراد نقلها إلى المخزن المؤقت (الافتراضي هو 8192 بايت) ، ثم يرسل البيانات في هذا المخزن المؤقت معًا من خلال طريقة التدفق. لذلك ، bw.flush () ؛ ضروري.
2. السبب في إضافة "/r/n/r/n" بعد Hello World عند إرسال سلسلة هو أن رأس بروتوكول HTTP يستخدم "/r/n/r/n" كعلم النهاية (سيتم شرح المحتوى التفصيلي لبروتوكول HTTP لاحقًا). لذلك ، بإضافة "/r/n/r/n" بعد إرسال سلسلة ، يمكن أن يعتقد برنامج الخادم أن رأس HTTP قد انتهى ويمكن معالجته. إذا لم تتم إضافة "/r/n/r/n" ، فسينتظر برنامج الخادم نهاية رأس HTTP ، أي ، "/r/n/r/n". إذا كان الأمر كذلك ، فلن يرسل برنامج الخادم معلومات الاستجابة إلى العميل ، وسيتم حظر BR.ReadLine () لأنه لا يمكن قراءته للرد على المعلومات حتى يتم توقيت الاتصال.
3. قم بإيقاف تشغيل اتصال الشبكة
حتى الآن ، لدينا فهم أولي لطرق الاستخدام الأساسية لفئة المقبس ، ولكن بعد معالجة فئة المقبس للبيانات ، تتمثل الطريقة الأكثر منطقية في استخدام طريقة إغلاق فئة المقبس لإغلاق اتصال الشبكة. على الرغم من أن الطريقة الإغلاق قد تم استخدامها في ذلك ، فإن طريقة إغلاق اتصال الشبكة ليست مجرد طريقة الإغلاق. دعونا نرى تحت الظروف التي يمكن أن تغلق جافا اتصال الشبكة.
هناك أربع حالات يمكن إغلاق اتصالات الشبكة:
على الرغم من أن كل هذه الطرق الأربعة يمكن أن تحقق نفس الهدف ، فمن الأفضل استخدام الطريقة الأولى أو الثانية لإغلاق اتصال الشبكة. وذلك لأن الطرق الثالثة والرابعة عمومًا لا تغلق اتصال الشبكة على الفور. إذا كان الأمر كذلك ، بالنسبة لبعض التطبيقات ، سيتم ترك عدد كبير من اتصالات الشبكة عديمة الفائدة ، والتي ستشغل كمية كبيرة من موارد النظام.
بعد إغلاق كائن المقبس ، يمكننا استخدام الطريقة ISCLOSED لتحديد ما إذا كان كائن المقبس في حالة مغلقة. ومع ذلك ، فإن ما يتم إرجاعه باستخدام الطريقة ISCLOSED هو الحالة الحالية لكائن المقبس. وهذا يعني ، بغض النظر عما إذا كان كائن المقبس قد تم توصيله بنجاح ، يعيد ISClosde صحيحًا طالما أنه في الحالة المغلقة. إذا قمت فقط بإنشاء كائن مقبس غير متصل ، فإن IsClose يعيد أيضًا صحيحًا. كما هو موضح في الكود التالي ، سيتم إخراج FALSE.
Socket Socket = New Socket () ؛ system.out.println (Socket.isclosed ()) ؛
بالإضافة إلى طريقة ISClose ، تحتوي فئة المقبس أيضًا على طريقة ISCONDICED لتحديد ما إذا كان كائن المقبس متصلاً بنجاح. عندما ترى هذا الاسم ، قد يسيء فهم القراء. في الواقع ، لا تحدد طريقة ISConnected حالة الاتصال الحالية لكائن المقبس ، ولكن ما إذا كان كائن المقبس قد تم توصيله بنجاح. إذا كان قد تم توصيله بنجاح ، حتى لو كان ISClose يعود صحيحًا الآن ، فلا يزال هناك إرجاع صحيح. لذلك ، لتحديد ما إذا كان كائن المقبس الحالي موجودًا في حالة متصلة ، يجب استخدام طرق ISClose و isConnection في نفس الوقت ، أي أن كائن المقبس في حالة متصلة فقط عندما يعيد ISCLOSE عوائد خاطئة ومراقبة صحيحة. يوضح الرمز التالي عملية توليد الحالات المختلفة لكائن المقبس أعلاه.
حزمة mysocket ؛ استيراد java.net.*؛ الفئة العامة myCloseConnection {public static void printState (Socket Socket ، اسم السلسلة) {system.out.println (name + ".isclosed ():" + socket.isclosed ()) ؛ system.out.println (name + ".isconnected ():" + socket.isconnected ()) ؛ if (socket.isclosed () == false && socket.isconnected () == true) system.out.println (name + "in connected state!") ؛ else system.out.println (الاسم + "في حالة غير متصلة!") ؛ System.out.println () ؛ } public static void main (string [] args) يلقي الاستثناء {socket socket1 = null ، socket2 = null ؛ Socket1 = Socket ("www.ptpress.com.cn" ، 80) ؛ PrintState (Socket1 ، "Socket1") ؛ socket1.getOutputStream (). close () ؛ PrintState (Socket1 ، "Socket1") ؛ Socket2 = مقبس جديد () ؛ PrintState (Socket2 ، "Socket2") ؛ Socket2.close () ؛ PrintState (Socket2 ، "Socket2") ؛ }} بعد تشغيل الكود أعلاه ، سيتم عرض الإخراج التالي:
Socket1.isclosed (): خطأ
Socket1.isconnected (): صحيح
Socket1 في حالة متصلة!
Socket1.isclosed (): صحيح
Socket1.isconnected (): صحيح
Socket1 في حالة غير متصلة!
Socket2.isclosed (): خطأ
Socket2.isconnected (): خطأ
Socket2 في حالة غير متصلة!
Socket2.isclosed (): صحيح
Socket2.isconnected (): خطأ
Socket2 في حالة غير متصلة!
من نتائج الإخراج ، يمكن ملاحظة أنه بعد إغلاق Socket1 OutputStream ، يتم إغلاق Socket1 تلقائيًا أيضًا. في الكود أعلاه ، يمكننا أن نرى أنه بالنسبة لمقبس كائن المقبس 2 غير متصل بالخادم ، فإن طريقة ملائمة لها خاطئة. إذا تم إرجاع طريقة Socket2 بشكل صحيح ، فيجب استدعاء الطريقة الإغلاق بشكل كبير باستخدام Socket2.close.
على الرغم من معظم الوقت ، يمكننا استخدام فئة المقبس أو الطريقة الإغلاق لدفق الإدخال والإخراج لإغلاق اتصال الشبكة ، في بعض الأحيان نريد فقط إغلاق OutputStream أو InputStream ، وأثناء إغلاق دفق الإدخال والإخراج ، لا نغلق اتصال الشبكة. هذا يتطلب استخدام طريقتين أخريين لفئة المقبس: إيقاف التشغيل وإيقاف التشغيل. تغلق هاتان الطريقتان فقط تدفقات الإدخال والإخراج المقابلة ، ولكن لا تملك وظيفة إغلاق اتصال الشبكة في نفس الوقت. مثل الطرق التي تتواصل معها و isconnected ، توفر فئة المقبس أيضًا طريقتين لتحديد ما إذا كانت تدفقات الإدخال والإخراج لكائن المقبس مغلقة. هاتان الطريقتان هما isinputshutdown () و isOutputShutdown (). يوضح الرمز التالي عملية إغلاق تدفقات الإدخال والإخراج فقط:
حزمة mysocket ؛ استيراد java.net.*؛ الفئة العامة mycloseConnection1 {public static void printstate (Socket Socket) {system.out.println ("isinputshutdown:" + socket.isinputshutdown ()) ؛ System.out.println ("IsOutputShutdown:" + socket.isoutputshutdown ()) ؛ system.out.println ("isclosed:" + socket.isclosed ()) ؛ System.out.println () ؛ } static void main (string [] args) يلقي الاستثناء {socket socket = new Socket ("www.ptpress.com.cn" ، 80) ؛ PrintState (مأخذ) ؛ Socket.shutdownInput () ؛ PrintState (مأخذ) ؛ socket.shutdownoutput () ؛ PrintState (مأخذ) ؛ }} بعد تشغيل الجيل أعلاه ، ستحصل على الإخراج التالي:
Isinputshutdown: خطأ
ISOUTPUTSHUTDOWN: خطأ
ملموس: خطأ
Isinputshutdown: صحيح
ISOUTPUTSHUTDOWN: خطأ
ملموس: خطأ
Isinputshutdown: صحيح
ISOUTPUTSHUTDOWN: صحيح
ملموس: خطأ
من نتائج الإخراج ، يمكننا أن نرى أن الطريقة التي يتم وضعها تعيد دائمًا خطأ ، لذلك من المؤكد أن إيقاف التشغيل والإغلاق لا يؤثر على حالة كائن المقبس.
آمل أن يكون هذا المقال مفيدًا لك. هذا كله بالنسبة لـ Java لاستخدام فئة المقبس لتلقي محتوى البيانات وإرسالها. آمل أن يستمر الجميع في متابعة موقعنا! إذا كنت ترغب في تعلم Java ، فيمكنك متابعة متابعة هذا الموقع.