كيفية إنشاء تطبيق شبكة بجافا (بالصور)

جدول المحتويات:

كيفية إنشاء تطبيق شبكة بجافا (بالصور)
كيفية إنشاء تطبيق شبكة بجافا (بالصور)

فيديو: كيفية إنشاء تطبيق شبكة بجافا (بالصور)

فيديو: كيفية إنشاء تطبيق شبكة بجافا (بالصور)
فيديو: كيف تقوم بإلتقاط صورة لشاشة هاتف ال جي جي4 بطريقتين بسيطتين 2024, يمكن
Anonim

كتابة التعليمات البرمجية التي يتم تنفيذها على جهاز معين مرضية للغاية. لكن كتابة التعليمات البرمجية التي يتم تنفيذها على العديد من الأجهزة التي تتواصل مع بعضها البعض هي ببساطة تأكيد للحياة. ستعلمك هذه المقالة كيفية الاتصال وتبادل الرسائل عبر الشبكة باستخدام بروتوكول التحكم في الإرسال (TCP).

في هذه المقالة ، ستقوم بإعداد تطبيق يقوم بتوصيل جهاز الكمبيوتر الخاص بك بنفسه ، وبشكل أساسي ، يجعله مجنونًا - تحدث إلى نفسه. سوف تتعلم أيضًا الفرق بين أكثر التدفقات استخدامًا للشبكات في Java وكيفية عملها.

تيارات البيانات والكائنات

قبل الغوص في الكود ، يجب تمييز الفرق بين الدفقين المستخدمَين في المقالة.

تيارات البيانات

تدفقات البيانات تعالج أنواع وسلاسل البيانات البدائية. يجب إجراء تسلسل يدوي للبيانات المرسلة عبر تدفقات البيانات وإلغاء تسلسلها مما يجعل نقل البيانات المعقدة أكثر صعوبة. ولكن ، يمكن لتدفقات البيانات التواصل مع الخوادم والعملاء المكتوبة بلغات أخرى غير Java. تتشابه التدفقات الأولية مع تدفقات البيانات في هذا الجانب ، لكن تدفقات البيانات تضمن تنسيق البيانات بطريقة مستقلة عن النظام الأساسي وهو أمر مفيد لأن كلا الطرفين سيكونان قادرين على قراءة البيانات المرسلة.

تيارات الكائن

تقوم تدفقات الكائن بمعالجة أنواع البيانات الأولية والكائنات التي يتم تنفيذها

المسلسل

واجهه المستخدم. يتم إجراء تسلسل للبيانات المرسلة عبر تدفقات الكائنات وإلغاء تسلسلها تلقائيًا مما يسهل نقل البيانات المعقدة. ولكن ، لا يمكن لتدفقات الكائنات الاتصال إلا بالخوادم والعملاء المكتوبة بلغة Java. أيضا،

ObjectOutputStream

، عند التهيئة ، يرسل رأسًا إلى

تيار الإدخال

الطرف الآخر الذي ، عند التهيئة ، يمنع التنفيذ حتى يتم استلام الرأس.

خطوات

قم بإنشاء تطبيق شبكة في Java Step1
قم بإنشاء تطبيق شبكة في Java Step1

الخطوة الأولى: قم بإنشاء فصل دراسي

قم بإنشاء فصل وتسميته بالطريقة التي تريدها. في هذه المقالة ، سيتم تسميته

مثال على تطبيق الشبكة

NetworkAppExample من فئة عامة {}

قم بإنشاء تطبيق شبكة في Java Step2
قم بإنشاء تطبيق شبكة في Java Step2

الخطوة 2. إنشاء طريقة رئيسية

أنشئ طريقة رئيسية وأعلن أنها قد تطرح استثناءات لـ

استثناء

اكتب وأي فئة فرعية منه - جميع الاستثناءات. تعتبر هذه ممارسة سيئة ، ولكنها مقبولة للأمثلة المجردة.

فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {}}

قم بإنشاء تطبيق شبكة في Java Step3
قم بإنشاء تطبيق شبكة في Java Step3

الخطوة 3. التصريح بعنوان الخادم

سيستخدم هذا المثال عنوان المضيف المحلي ورقم منفذ عشوائي. يجب أن يكون رقم المنفذ في نطاق من 0 إلى 65535 (ضمناً). ومع ذلك ، فإن أرقام المنافذ التي يجب تجنبها تتراوح من 0 إلى 1023 (ضمناً) لأنها منافذ نظام محجوزة.

فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ }}

قم بإنشاء تطبيق شبكة في Java Step4
قم بإنشاء تطبيق شبكة في Java Step4

الخطوة 4. إنشاء خادم

يرتبط الخادم بالعنوان والمنفذ ويستمع للاتصالات الواردة. في جافا ،

سيرفر سوكيت

يمثل نقطة نهاية جانب الخادم وتتمثل وظيفته في قبول الاتصالات الجديدة.

سيرفر سوكيت

لا يحتوي على تدفقات لقراءة البيانات وإرسالها لأنه لا يمثل الاتصال بين الخادم والعميل.

استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = خادم ServerSocket جديد (منفذ ، 50 ، InetAddress.getByName (مضيف)) ؛ }}

قم بإنشاء تطبيق شبكة في Java Step5
قم بإنشاء تطبيق شبكة في Java Step5

الخطوة 5. تسجيل بدء الخادم

لأغراض التسجيل ، اطبع إلى وحدة التحكم التي تم بدء تشغيل الخادم فيها.

استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = خادم ServerSocket جديد (منفذ ، 50 ، InetAddress.getByName (مضيف)) ؛ System.out.println ("بدأ الخادم.") ؛ }}

قم بإنشاء تطبيق الشبكة في Java Step6
قم بإنشاء تطبيق الشبكة في Java Step6

الخطوة 6. إنشاء عميل

يرتبط العميل بعنوان ومنفذ الخادم ويستمع إلى الحزم (الرسائل) بعد إنشاء الاتصال. في جافا ،

قابس كهرباء

يمثل إما نقطة نهاية من جانب العميل متصلة بالخادم أو اتصالاً (من الخادم) إلى العميل ويتم استخدامه للتواصل مع الطرف على الطرف الآخر.

استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ }}

قم بإنشاء تطبيق شبكة في Java Step7
قم بإنشاء تطبيق شبكة في Java Step7

الخطوة 7. تسجيل محاولة الاتصال

لأغراض التسجيل ، اطبع إلى وحدة التحكم التي تمت محاولة الاتصال بها.

استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ }}

قم بإنشاء تطبيق شبكة في Java Step8
قم بإنشاء تطبيق شبكة في Java Step8

الخطوة 8. إنشاء اتصال

لن يتصل العملاء أبدًا ما لم يستمع الخادم ويقبل ، بمعنى آخر ، الاتصالات. في Java ، يتم إنشاء الاتصالات باستخدام

قبول()

طريقة

سيرفر سوكيت

صف دراسي. ستمنع الطريقة التنفيذ حتى يتصل العميل.

استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ }}

قم بإنشاء تطبيق شبكة في Java Step9
قم بإنشاء تطبيق شبكة في Java Step9

الخطوة 9. تسجيل الاتصال المنشأة

لأغراض التسجيل ، اطبع إلى وحدة التحكم أن الاتصال بين الخادم والعميل قد تم إنشاؤه.

استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ }}

قم بإنشاء تطبيق شبكة في Java Step10
قم بإنشاء تطبيق شبكة في Java Step10

الخطوة 10. إعداد تدفقات الاتصال

يتم الاتصال عبر التدفقات ، وفي هذا التطبيق ، يجب ربط التدفقات الأولية (الاتصال من) الخادم (إلى العميل) والعميل بالسلاسل إما إلى تدفقات البيانات أو الكائنات. تذكر أن كلا الطرفين بحاجة إلى استخدام نفس نوع الدفق.

  • تدفقات البيانات

    استيراد java.io. DataInputStream ؛ استيراد java.io. DataOutputStream ؛ استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ DataOutputStream clientOut = جديد DataOutputStream (client.getOutputStream ()) ؛ DataInputStream clientIn = جديد DataInputStream (client.getInputStream ()) ؛ DataOutputStream serverOut = جديد DataOutputStream (connection.getOutputStream ()) ؛ DataInputStream serverIn = جديد DataInputStream (connection.getInputStream ()) ؛ }}

  • تيارات الكائن

    عند استخدام تدفقات كائنات متعددة ، يجب تهيئة تدفقات الإدخال بنفس ترتيب تدفقات الإخراج بسبب

    ObjectOutputStream

    يرسل رأسًا إلى الطرف الآخر و

    ObjectInputStream

    يمنع التنفيذ حتى يقرأ العنوان.

    استيراد java.io. ObjectInputStream ؛ استيراد java.io. ObjectOutputStream ؛ استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ ObjectOutputStream clientOut = new ObjectOutputStream (client.getOutputStream ()) ؛ ObjectOutputStream serverOut = new ObjectOutputStream (connection.getOutputStream ()) ؛ ObjectInputStream clientIn = new ObjectInputStream (client.getInputStream ()) ؛ ObjectInputStream serverIn = new ObjectInputStream (connection.getInputStream ()) ؛ }}

    قد يكون من الأسهل تذكر الترتيب كما هو محدد في الكود أعلاه - قم أولاً بتهيئة تدفقات الإخراج ثم إدخال التدفقات بنفس الترتيب. ومع ذلك ، هناك طلب آخر لتهيئة تدفقات الكائنات كما يلي:

    ObjectOutputStream clientOut = new ObjectOutputStream (client.getOutputStream ()) ؛ ObjectInputStream serverIn = new ObjectInputStream (connection.getInputStream ()) ؛ ObjectOutputStream serverOut = new ObjectOutputStream (connection.getOutputStream ()) ؛ ObjectInputStream clientIn = new ObjectInputStream (client.getInputStream ()) ؛

قم بإنشاء تطبيق شبكة في Java Step11
قم بإنشاء تطبيق شبكة في Java Step11

الخطوة 11. سجل أن الاتصال جاهز

لأغراض التسجيل ، اطبع على وحدة التحكم أن الاتصال جاهز.

// حذف كود الاستيراد java.net. InetAddress؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = خادم ServerSocket جديد (منفذ ، 50 ، InetAddress.getByName (مضيف)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ // رمز تم حذفه System.out.println ("الاتصال جاهز.") ؛ }}

قم بإنشاء تطبيق شبكة في Java Step12
قم بإنشاء تطبيق شبكة في Java Step12

الخطوة 12. إنشاء رسالة

في هذا التطبيق ،

مرحبا بالعالم

سيتم إرسال النص إلى الخادم إما

بايت

أو

سلسلة

. قم بتعريف متغير من النوع الذي يعتمد على الدفق المستخدم. يستخدم

بايت

لتدفقات البيانات و

سلسلة

لتدفقات الكائن.

  • تدفقات البيانات

    باستخدام تدفقات البيانات ، يتم إجراء التسلسل عن طريق تحويل الكائنات إلى أنواع بيانات أولية أو ملف

    سلسلة

    . في هذه الحالة،

    سلسلة

    تم تحويله إلى

    بايت

    بدلا من الكتابة باستخدام

    writeBytes ()

    طريقة لإظهار كيفية القيام بذلك مع كائنات أخرى ، مثل الصور أو الملفات الأخرى.

    استيراد java.io. DataInputStream ؛ استيراد java.io. DataOutputStream ؛ استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ DataOutputStream clientOut = جديد DataOutputStream (client.getOutputStream ()) ؛ DataInputStream clientIn = جديد DataInputStream (client.getInputStream ()) ؛ DataOutputStream serverOut = جديد DataOutputStream (connection.getOutputStream ()) ؛ DataInputStream serverIn = جديد DataInputStream (connection.getInputStream ()) ؛ System.out.println ("الاتصال جاهز.") ؛ بايت messageOut = "مرحبًا بالعالم".getBytes () ؛ }}

  • تيارات الكائن

    استيراد java.io. ObjectInputStream ؛ استيراد java.io. ObjectOutputStream ؛ استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = خادم ServerSocket جديد (منفذ ، 50 ، InetAddress.getByName (مضيف)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ ObjectOutputStream clientOut = new ObjectOutputStream (client.getOutputStream ()) ؛ ObjectOutputStream serverOut = new ObjectOutputStream (connection.getOutputStream ()) ؛ ObjectInputStream clientIn = new ObjectInputStream (client.getInputStream ()) ؛ ObjectInputStream serverIn = new ObjectInputStream (connection.getInputStream ()) ؛ System.out.println ("الاتصال جاهز.") ؛ String messageOut = "Hello World" ؛ }}

قم بإنشاء تطبيق شبكة في Java Step13
قم بإنشاء تطبيق شبكة في Java Step13

الخطوة 13. إرسال الرسالة

اكتب البيانات إلى دفق الإخراج ودفق الدفق لضمان كتابة البيانات بالكامل.

  • تدفقات البيانات

    يجب إرسال طول الرسالة أولاً حتى يعرف الطرف الآخر عدد البايت الذي يحتاج إلى قراءته. بعد إرسال الطول كنوع عدد صحيح أولي ، يمكن إرسال البايت.

    استيراد java.io. DataInputStream ؛ استيراد java.io. DataOutputStream ؛ استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ DataOutputStream clientOut = جديد DataOutputStream (client.getOutputStream ()) ؛ DataInputStream clientIn = جديد DataInputStream (client.getInputStream ()) ؛ DataOutputStream serverOut = جديد DataOutputStream (connection.getOutputStream ()) ؛ DataInputStream serverIn = جديد DataInputStream (connection.getInputStream ()) ؛ System.out.println ("الاتصال جاهز.") ؛ بايت messageOut = "مرحبًا بالعالم".getBytes () ؛ clientOut.writeInt (messageOut.length) ، clientOut.write (messageOut) ؛ clientOut.flush () ، }}

  • تيارات الكائن

    استيراد java.io. ObjectInputStream ؛ استيراد java.io. ObjectOutputStream ؛ استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = خادم ServerSocket جديد (منفذ ، 50 ، InetAddress.getByName (مضيف)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ ObjectOutputStream clientOut = new ObjectOutputStream (client.getOutputStream ()) ؛ ObjectOutputStream serverOut = new ObjectOutputStream (connection.getOutputStream ()) ؛ ObjectInputStream clientIn = new ObjectInputStream (client.getInputStream ()) ؛ ObjectInputStream serverIn = new ObjectInputStream (connection.getInputStream ()) ؛ System.out.println ("الاتصال جاهز.") ؛ String messageOut = "Hello World" ؛ clientOut.writeObject (messageOut) ، clientOut.flush () ، }}

قم بإنشاء تطبيق شبكة في Java Step14
قم بإنشاء تطبيق شبكة في Java Step14

الخطوة 14. تسجيل الرسالة المرسلة

لأغراض التسجيل ، اطبع إلى وحدة التحكم تلك الرسالة التي تم إرسالها.

  • تدفقات البيانات

    استيراد java.io. DataInputStream ؛ استيراد java.io. DataOutputStream ؛ استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ DataOutputStream clientOut = جديد DataOutputStream (client.getOutputStream ()) ؛ DataInputStream clientIn = جديد DataInputStream (client.getInputStream ()) ؛ DataOutputStream serverOut = جديد DataOutputStream (connection.getOutputStream ()) ؛ DataInputStream serverIn = جديد DataInputStream (connection.getInputStream ()) ؛ System.out.println ("الاتصال جاهز.") ؛ بايت messageOut = "مرحبًا بالعالم".getBytes () ؛ clientOut.writeInt (messageOut.length) ، clientOut.write (messageOut) ؛ clientOut.flush () ، System.out.println ("تم إرسال الرسالة إلى الخادم:" + سلسلة جديدة (messageOut)) ؛ }}

  • تيارات الكائن

    استيراد java.io. ObjectInputStream ؛ استيراد java.io. ObjectOutputStream ؛ استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ ObjectOutputStream clientOut = new ObjectOutputStream (client.getOutputStream ()) ؛ ObjectOutputStream serverOut = new ObjectOutputStream (connection.getOutputStream ()) ؛ ObjectInputStream clientIn = new ObjectInputStream (client.getInputStream ()) ؛ ObjectInputStream serverIn = new ObjectInputStream (connection.getInputStream ()) ؛ System.out.println ("الاتصال جاهز.") ؛ String messageOut = "Hello World" ؛ clientOut.writeObject (messageOut) ، clientOut.flush () ، System.out.println ("الرسالة المرسلة إلى الخادم:" + messageOut) ؛ }}

قم بإنشاء تطبيق شبكة في Java Step15
قم بإنشاء تطبيق شبكة في Java Step15

الخطوة 15. اقرأ الرسالة

قراءة البيانات من دفق الإدخال وتحويلها. نظرًا لأننا نعرف بالضبط نوع البيانات المرسلة ، فسننشئ إما ملف

سلسلة

من عند

بايت

أو يلقي

موضوع

إلى

سلسلة

دون التحقق ، اعتمادًا على الدفق المستخدم.

  • تدفقات البيانات

    نظرًا لإرسال الطول أولاً والبايت بعد ذلك ، يجب إجراء القراءة بنفس الترتيب. إذا كان الطول صفرًا ، فلا يوجد شيء للقراءة. يتم إلغاء تسلسل الكائن عندما يتم تحويل البايت مرة أخرى إلى مثيل ، في هذه الحالة ، من

    سلسلة

    استيراد java.io. DataInputStream ؛ استيراد java.io. DataOutputStream ؛ استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ DataOutputStream clientOut = جديد DataOutputStream (client.getOutputStream ()) ؛ DataInputStream clientIn = جديد DataInputStream (client.getInputStream ()) ؛ DataOutputStream serverOut = جديد DataOutputStream (connection.getOutputStream ()) ؛ DataInputStream serverIn = جديد DataInputStream (connection.getInputStream ()) ؛ System.out.println ("الاتصال جاهز.") ؛ بايت messageOut = "مرحبًا بالعالم".getBytes () ؛ clientOut.writeInt (messageOut.length) ، clientOut.write (messageOut) ؛ clientOut.flush () ، System.out.println ("تم إرسال الرسالة إلى الخادم:" + سلسلة جديدة (messageOut)) ؛ int length = serverIn.readInt () ؛ إذا (الطول> 0) {بايت messageIn = بايت جديد [الطول] ؛ serverIn.readFully (messageIn، 0، messageIn.length) ؛ }}}

  • تيارات الكائن

    استيراد java.io. ObjectInputStream ؛ استيراد java.io. ObjectOutputStream ؛ استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ ObjectOutputStream clientOut = new ObjectOutputStream (client.getOutputStream ()) ؛ ObjectOutputStream serverOut = new ObjectOutputStream (connection.getOutputStream ()) ؛ ObjectInputStream clientIn = new ObjectInputStream (client.getInputStream ()) ؛ ObjectInputStream serverIn = new ObjectInputStream (connection.getInputStream ()) ؛ System.out.println ("الاتصال جاهز.") ؛ String messageOut = "Hello World" ؛ clientOut.writeObject (messageOut) ، clientOut.flush () ، System.out.println ("الرسالة المرسلة إلى الخادم:" + messageOut) ؛ String messageIn = (String) serverIn.readObject () ، }}

قم بإنشاء تطبيق شبكة في Java Step16
قم بإنشاء تطبيق شبكة في Java Step16

الخطوة 16. سجل قراءة الرسالة

لأغراض التسجيل ، اطبع إلى وحدة التحكم تلك الرسالة التي تم استلامها واطبع محتواها.

  • تدفقات البيانات

    استيراد java.io. DataInputStream ؛ استيراد java.io. DataOutputStream ؛ استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ DataOutputStream clientOut = جديد DataOutputStream (client.getOutputStream ()) ؛ DataInputStream clientIn = جديد DataInputStream (client.getInputStream ()) ؛ DataOutputStream serverOut = جديد DataOutputStream (connection.getOutputStream ()) ؛ DataInputStream serverIn = جديد DataInputStream (connection.getInputStream ()) ؛ System.out.println ("الاتصال جاهز.") ؛ بايت messageOut = "مرحبًا بالعالم".getBytes () ؛ clientOut.writeInt (messageOut.length) ، clientOut.write (messageOut) ؛ clientOut.flush () ، System.out.println ("تم إرسال الرسالة إلى الخادم:" + سلسلة جديدة (messageOut)) ؛ int length = serverIn.readInt () ؛ إذا (الطول> 0) {بايت messageIn = بايت جديد [الطول] ؛ serverIn.readFully (messageIn، 0، messageIn.length) ؛ System.out.println ("رسالة مستلمة من العميل:" + سلسلة جديدة (messageIn)) ؛ }}}

  • تيارات الكائن

    استيراد java.io. ObjectInputStream ؛ استيراد java.io. ObjectOutputStream ؛ استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ ObjectOutputStream clientOut = new ObjectOutputStream (client.getOutputStream ()) ؛ ObjectOutputStream serverOut = new ObjectOutputStream (connection.getOutputStream ()) ؛ ObjectInputStream clientIn = new ObjectInputStream (client.getInputStream ()) ؛ ObjectInputStream serverIn = new ObjectInputStream (connection.getInputStream ()) ؛ System.out.println ("الاتصال جاهز.") ؛ String messageOut = "Hello World" ؛ clientOut.writeObject (messageOut) ، clientOut.flush () ، System.out.println ("الرسالة المرسلة إلى الخادم:" + messageOut) ؛ String messageIn = (String) serverIn.readObject () ، System.out.println ("رسالة مستلمة من العميل:" + messageIn) ؛ }}

قم بإنشاء تطبيق شبكة في Java Step17
قم بإنشاء تطبيق شبكة في Java Step17

الخطوة 17. افصل التوصيلات

يتم قطع الاتصال عندما يغلق أحد الأطراف التدفقات الخاصة به. في Java ، عن طريق إغلاق تدفق الإخراج ، يتم إغلاق المقبس ودفق الإدخال المرتبط أيضًا. بمجرد أن يكتشف الطرف الموجود على الطرف الآخر أن الاتصال قد توقف ، فإنه يحتاج إلى إغلاق تدفق الإخراج أيضًا لمنع تسرب الذاكرة.

// حذف كود الاستيراد java.net. InetAddress؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ // رمز تم حذفه System.out.println ("الاتصال جاهز.") ؛ // تم حذف الكود clientOut.close () ؛ serverOut.close () ، }}

قم بإنشاء تطبيق شبكة في Java Step18 V2
قم بإنشاء تطبيق شبكة في Java Step18 V2

الخطوة 18. تسجيل قطع الاتصال

لأغراض التسجيل ، تم قطع اتصالات الطباعة إلى وحدة التحكم.

// حذف كود الاستيراد java.net. InetAddress؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ // رمز تم حذفه System.out.println ("الاتصال جاهز.") ؛ // تم حذف الكود clientOut.close () ؛ serverOut.close () ، System.out.println ("اتصالات مغلقة.") ؛ }}

قم بإنشاء تطبيق شبكة في Java Step19
قم بإنشاء تطبيق شبكة في Java Step19

الخطوة 19. إنهاء الخادم

الاتصالات غير متصلة ، لكن الخادم لا يزال قيد التشغيل. كما

سيرفر سوكيت

لا يرتبط بأي بث ، يجب إغلاقه صراحةً عن طريق الاتصال

أغلق()

طريقة.

// حذف كود الاستيراد java.net. InetAddress؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ // رمز تم حذفه System.out.println ("الاتصال جاهز.") ؛ // تم حذف الكود clientOut.close () ؛ serverOut.close () ، System.out.println ("اتصالات مغلقة.") ؛ server.close () ؛ }}

قم بإنشاء تطبيق شبكة في Java Step20
قم بإنشاء تطبيق شبكة في Java Step20

الخطوة 20. تسجيل إنهاء الخادم

لأغراض التسجيل ، تم إنهاء الطباعة إلى خادم وحدة التحكم.

// حذف كود الاستيراد java.net. InetAddress؛ استيراد java.net. ServerSocket ؛ استيراد java.net. Socket ؛ فئة عامة NetworkAppExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ ServerSocket = new ServerSocket (المنفذ ، 50 ، InetAddress.getByName (host)) ؛ System.out.println ("بدأ الخادم.") ؛ عميل مأخذ توصيل = مقبس جديد (مضيف ، منفذ) ؛ System.out.println ("الاتصال بالخادم …") ؛ اتصال المقبس = server.accept () ؛ System.out.println ("تم إنشاء الاتصال") ؛ // رمز تم حذفه System.out.println ("الاتصال جاهز.") ؛ // تم حذف الكود clientOut.close () ؛ serverOut.close () ، System.out.println ("اتصالات مغلقة.") ؛ server.close () ؛ System.out.println ("تم إنهاء الخادم.") ؛ }}

قم بإنشاء تطبيق شبكة في Java Step21
قم بإنشاء تطبيق شبكة في Java Step21

الخطوة 21. تجميع وتشغيل

مكننا التسجيل من معرفة ما إذا كان التطبيق ناجحًا أم لا. الناتج المتوقع:

بدأ الخادم. جاري الاتصال بالخادم … تم تأسيس الاتصال. الاتصال جاهز. تم إرسال الرسالة إلى الخادم: تم استلام رسالة Hello World من العميل: تم إغلاق Hello World Connections. تم إنهاء الخادم.

في حال لم يكن الإخراج الخاص بك مثل الناتج أعلاه ، وهو أمر غير مرجح حدوثه ، فهناك بعض الحلول:

  • إذا توقف الإخراج عند الخط

    تم تأسيس الاتصال.

    ويتم استخدام تدفقات الكائن ، مسح كل منهما

    ObjectOutputStream

  • مباشرة بعد التهيئة لأنه لم يتم إرسال الرؤوس لسبب ما.
  • إذا تمت طباعة الإخراج

    java.net. BindException: العنوان مستخدم بالفعل

  • ، اختر رقم منفذ مختلف لأن المنفذ المحدد مستخدم بالفعل.

نصائح

  • يتم الاتصال بخادم على شبكة مختلفة عن طريق الاتصال بعنوان IP الخارجي لجهاز يقوم بتشغيل الخادم الذي يحتوي على منفذ معاد توجيهه.
  • يتم الاتصال بخادم على نفس الشبكة إما عن طريق الاتصال بعنوان IP الخاص بجهاز يقوم بتشغيل الخادم أو إعادة توجيه منفذ والاتصال بعنوان IP الخارجي للجهاز.
  • هناك برنامج ، مثل Hamachi ، يسمح بالاتصال بالخادم على شبكة مختلفة دون إعادة توجيه منفذ ، ولكنه يتطلب تثبيت البرنامج على كلا الجهازين.

أمثلة

تحتاج تطبيقات الشبكة التي تستخدم حظر الإدخال / الإخراج إلى استخدام مؤشرات الترابط. تُظهر الأمثلة التالية تطبيقًا بسيطًا للخادم والعميل باستخدام مؤشرات الترابط. رمز الشبكة هو نفسه في المقالة بشكل أساسي باستثناء بعض المقتطفات التي تمت مزامنتها ونقلها إلى سلاسل الرسائل ويتم التعامل مع الاستثناءات.

Server.java

استيراد java.io. IOException ؛ استيراد java.net. InetAddress ؛ استيراد java.net. ServerSocket ؛ استيراد java.net. SocketException ؛ استيراد java.net. UnknownHostException ؛ استيراد java.util. ArrayList ؛ استيراد java.util. Collections ؛ استيراد java.util. List ؛ / ** * تمثل الفئة {code Server} نقطة نهاية الخادم في الشبكة. بمجرد ربط {code Server} بعنوان IP ومنفذ معينين ، يُنشئ اتصالات مع العملاء ويكون قادرًا على الاتصال بهم أو فصلهم. *

* هذه الفئة هي موضوع آمن. * *version 1.0 *see Client *see Connection * / public class Server تنفذ Runnable {private ServerSocket server؛ قائمة خاصة روابط؛ موضوع خاص. اتصالات الكائن النهائية الخاصة ، قفل = كائن جديد () ؛ / ** * يُنشئ {code Server} يتفاعل مع العملاء على اسم المضيف والمنفذ المحددين مع الحد الأقصى * المطلوب للطول المحدد لقائمة انتظار العملاء القادمين. * *param host عنوان المضيف المراد استخدامه. *param رقم المنفذ المراد استخدامه. *param backlog مطلوب الحد الأقصى لطول قائمة انتظار العملاء القادمين. *throws NetworkException إذا حدث خطأ أثناء بدء تشغيل الخادم. * / الخادم العام (String host، int port، int backlog) يطرح NetworkException {try {server = new ServerSocket (port، backlog، InetAddress.getByName (host))؛ } catch (UnknownHostException e) {throw new NetworkException ("لا يمكن حل اسم المضيف:" + host، e)؛ } catch (IllegalArgumentException e) {throw new NetworkException ("يجب أن يكون رقم المنفذ بين 0 و 65535 (شامل):" + منفذ)؛ } catch (IOException e) {throw new NetworkException ("تعذر بدء تشغيل الخادم."، e)؛ } links = Collections.synchronizedList (new ArrayList ())؛ موضوع = موضوع جديد (هذا) ؛ thread.start () ؛ } / ** * يُنشئ {code Server} يتفاعل مع العملاء على المنفذ واسم المضيف المحددين. * *param host عنوان المضيف للربط. *param رقم المنفذ المراد ربطه. *throws NetworkException إذا حدثت أخطاء أثناء بدء تشغيل الخادم. * / الخادم العام (String host، int port) يطرح NetworkException {this (host، port، 50)؛ } / ** * للاستماع إلى الاتصالات الواردة من العملاء وقبولها وتسجيلها. * /Override public void run () {while (! server.isClosed ()) {try {links.add (new Connection (server.accept ()))؛ } catch (SocketException e) {if (! e.getMessage (). يساوي ("Socket مغلق")) {e.printStackTrace ()؛ }} catch (NetworkException | IOException e) {e.printStackTrace () ؛ }}} / ** * لإرسال البيانات إلى جميع العملاء المسجلين. * *param البيانات البيانات لإرسالها. *throws IllegalStateException إذا تمت محاولة كتابة البيانات عندما يكون الخادم غير متصل. *throws IllegalArgumentException إذا كانت البيانات المراد إرسالها فارغة. * / البث العام (بيانات الكائن) {if (server.isClosed ()) {throw new IllegalStateException ("لم يتم إرسال البيانات ، الخادم غير متصل.") ؛ } if (data == null) {throw new IllegalArgumentException ("null data")؛ } متزامنة (connectLock) {لـ (اتصال الاتصال: اتصالات) {حاول {connection.send (البيانات) ؛ System.out.println ("البيانات المرسلة للعميل بنجاح.")؛ } catch (NetworkException e) {e.printStackTrace ()؛ }}}} / ** * لإرسال رسالة قطع الاتصال وفصل العميل المحدد. * *param اتصال العميل لقطع الاتصال. *throws NetworkException إذا حدث خطأ أثناء إغلاق الاتصال. * / public void disconnect (اتصال Connection) يطرح NetworkException {if (links.remove (connection)) {connection.close ()؛ }} / ** * إرسال رسالة قطع الاتصال لجميع العملاء ، وفصلهم وإنهاء الخادم. * / public void close () يطرح NetworkException {متزامن (linksLock) {لـ (اتصال الاتصال: الاتصالات) {try {connection.close ()؛ } catch (NetworkException e) {e.printStackTrace ()؛ }}} links.clear ()؛ جرب {server.close () ، } catch (IOException e) {throw new NetworkException ("خطأ أثناء إغلاق الخادم.")؛ } أخيرًا {thread.interrupt ()؛ }} / ** * تُرجع ما إذا كان الخادم متصلاً أم لا. * *return True إذا كان الخادم متصلاً. خطأ ، وإلا. * / public boolean isOnline () {return! server.isClosed ()؛ } / ** * إرجاع مجموعة من العملاء المسجلين. * / الاتصال العام getConnections () {متزامنة (connectLock) {return links.toArray (new Connection [links.size ()]) ؛ }}}

Client.java

استيراد java.io. IOException ؛ استيراد java.net. Socket ؛ استيراد java.net. UnknownHostException ؛ / ** * تمثل الفئة {code Client} نقطة نهاية للعميل في الشبكة. {code Client} ، بمجرد الاتصال بخادم * معين ، يضمن أنه قادر فقط على الاتصال بالخادم. يعتمد ما إذا كان العملاء الآخرون يتلقون البيانات أم لا * على تنفيذ الخادم. *

* هذه الفئة هي موضوع آمن. * * @ الإصدار 1.0 * @ see Server *see Connection * / public class Client {private Connection connection؛ / ** * لإنشاء {code Client} متصل بالخادم على المضيف والمنفذ المحددين. * *param host عنوان المضيف للربط. *param رقم المنفذ المراد ربطه. *throws NetworkException إذا حدث خطأ أثناء بدء تشغيل الخادم. * / public Client (String host، int port) يطرح NetworkException {try {connection = new Connection (new Socket (host، port)) ؛ } catch (UnknownHostException e) {throw new NetworkException ("لا يمكن حل اسم المضيف:" + host، e)؛ } catch (IllegalArgumentException e) {throw new NetworkException ("يجب أن يكون رقم المنفذ بين 0 و 65535 (شامل):" + منفذ)؛ } catch (IOException e) {throw new NetworkException ("تعذر بدء تشغيل الخادم."، e)؛ }} / ** * لإرسال البيانات إلى الطرف الآخر. * *param البيانات البيانات لإرسالها. *throws NetworkException إذا فشلت الكتابة لإخراج الدفق. *throws IllegalStateException إذا تمت محاولة كتابة البيانات عند إغلاق الاتصال. *throws IllegalArgumentException إذا كانت البيانات المراد إرسالها فارغة. *throws UnsupportedOperationException إذا تمت محاولة إرسال نوع بيانات غير مدعوم. * / إرسال باطل عام (بيانات الكائن) يطرح NetworkException {connection.send (data)؛ } / ** * إرسال رسالة فصل إلى الخادم وإغلاق الاتصال به. * / public void close () يطرح NetworkException {connection.close ()؛ } / ** * إرجاع ما إذا كان العميل متصلاً بالخادم أم لا. * *return True إذا كان العميل متصلاً. خطأ ، وإلا. * / public boolean isOnline () {return connection.isConnected ()؛ } / ** * إرجاع مثيل {link Connection} الخاص بالعميل. * / public Connection getConnection () {return connection؛ }}

Connection.java

استيراد java.io. DataInputStream ؛ استيراد java.io. DataOutputStream ؛ استيراد java.io. IOException ؛ استيراد java.net. Socket ؛ استيراد java.net. SocketException ؛ / ** * تمثل الفئة {code Connection} إما اتصالاً من خادم إلى عميل أو نقطة نهاية عميل في شبكة * {code Connection} ، بمجرد الاتصال ، يكون قادرًا على تبادل البيانات مع طرف أو أطراف أخرى ، بناءً على على الخادم * التنفيذ. *

* هذه الفئة هي موضوع آمن. * * @ الإصدار 1.0 * @ see Server *see Client * / public class Connection تنفذ Runnable {private Socket socket؛ البيانات الخاصة DataOutputStream خارج ؛ DataInputStream الخاص في ؛ موضوع خاص. الكائن النهائي الخاص writeLock = new Object () ؛ كائن نهائي خاص readLock = new Object () ؛ / ** * ينشئ {code Connection} باستخدام تدفقات من {link Socket} محدد. * *param socket Socket لجلب التدفقات من.* / الاتصال العام (Socket socket) يطرح NetworkException {if (socket == null) {throw new IllegalArgumentException ("null socket") ؛ } this.socket = socket؛ جرب {out = new DataOutputStream (socket.getOutputStream ()) ؛ } catch (IOException e) {throw new NetworkException ("تعذر الوصول إلى تدفق الإخراج."، e)؛ } try {in = new DataInputStream (socket.getInputStream ()) ؛ } catch (IOException e) {throw new NetworkException ("تعذر الوصول إلى دفق الإدخال."، e)؛ } موضوع = موضوع جديد (هذا) ؛ thread.start () ؛ } / ** * يقرأ الرسائل عندما يكون الاتصال بالطرف الآخر على قيد الحياة. * /Override public void run () {while (! socket.isClosed ()) {try {int identifier؛ بايت بايت ؛ متزامن (readLock) {معرف = in.readInt () ؛ طول int = in.readInt () ؛ إذا (الطول> 0) {بايت = بايت جديد [الطول] ؛ in.readFully (بايت ، 0 ، bytes.length) ؛ } آخر {تواصل ؛ }} switch (المعرف) {case Identifier. INTERNAL: String command = new String (bytes)؛ if (command.equals ("disconnect")) {if (! socket.isClosed ()) {System.out.println ("تم استلام حزمة قطع الاتصال.") ؛ حاول {close ()؛ } catch (NetworkException e) {return؛ } } } استراحة؛ case Identifier. TEXT: System.out.println ("تم استلام الرسالة:" + سلسلة جديدة (بايت)) ؛ استراحة؛ الافتراضي: System.out.println ("تم استلام بيانات غير معروفة") ؛ }} catch (SocketException e) {if (! e.getMessage (). يساوي ("Socket مغلق")) {e.printStackTrace ()؛ }} catch (IOException e) {e.printStackTrace ()؛ }}} / ** * لإرسال البيانات إلى الطرف الآخر. * *param البيانات البيانات لإرسالها. *throws NetworkException إذا فشلت الكتابة لإخراج الدفق. *throws IllegalStateException إذا تمت محاولة كتابة البيانات عند إغلاق الاتصال. *throws IllegalArgumentException إذا كانت البيانات المراد إرسالها فارغة. *throws UnsupportedOperationException إذا تمت محاولة إرسال نوع بيانات غير مدعوم. * / إرسال باطل عام (بيانات الكائن) يطرح NetworkException {if (socket.isClosed ()) {throw new IllegalStateException ("لم يتم إرسال البيانات ، الاتصال مغلق.")؛ } if (data == null) {throw new IllegalArgumentException ("null data")؛ } معرف int؛ بايت بايت ؛ if (مثيل البيانات من السلسلة) {identifier = Identifier. TEXT ؛ البايت = ((سلسلة) البيانات).getBytes () ، } else {throw new UnsupportedOperationException ("نوع بيانات غير مدعوم:" + data.getClass ())؛ } جرب {synized (writeLock) {out.writeInt (identifier)؛ out.writeInt (bytes.length) ؛ out.write (بايت) ؛ out.flush () ؛ }} catch (IOException e) {throw new NetworkException ("لا يمكن إرسال البيانات."، e)؛ }} / ** * إرسال رسالة قطع الاتصال إلى الطرف الآخر وإغلاق الاتصال به. * / public void close () يطرح NetworkException {if (socket.isClosed ()) {throw new IllegalStateException ("الاتصال مغلق بالفعل.")؛ } جرب {byte message = "disconnect".getBytes () ؛ متزامن (writeLock) {out.writeInt (Identifier. INTERNAL) ؛ out.writeInt (message.length) ؛ out.write (رسالة) ؛ out.flush () ؛ }} catch (IOException e) {System.out.println ("تعذر إرسال رسالة قطع الاتصال.")؛ } جرب {synized (writeLock) {out.close ()؛ }} catch (IOException e) {throw new NetworkException ("خطأ أثناء إغلاق الاتصال."، e)؛ } أخيرًا {thread.interrupt ()؛ }} / ** * لعرض ما إذا كان الاتصال بالطرف الآخر على قيد الحياة أم لا. * *return True إذا كان الاتصال حياً. خطأ ، وإلا. * / public boolean isConnected () {return! socket.isClosed ()؛ }}

Identifier.java

/ ** * تحتوي الفئة {code Identifier} على ثوابت يستخدمها {link Connection} للتسلسل وإلغاء تسلسل البيانات * المرسلة عبر الشبكة. * *version 1.0 *see Connection * / public final class Identifier {/ ** * معرّف الرسائل الداخلية. * / عام ثابت نهائي داخلي = 1 ؛ / ** * معرّف للرسائل النصية. * / public static final int TEXT = 2 ؛ }

NetworkException.java

/ ** * تشير الفئة {code NetworkException} إلى خطأ متعلق بالشبكة. * / public class NetworkException توسع Exception {/ ** * تنشئ {code NetworkException} مع {code null} كرسالة لها. * / public NetworkException () {} / ** * تنشئ {code NetworkException} بالرسالة المحددة. * *param message رسالة لوصف الخطأ. * / public NetworkException (String message) {super (message) ؛ } / ** * لإنشاء {code NetworkException} بالرسالة والسبب المحددين. * *param message رسالة لوصف الخطأ. *param سبب خطأ. * / public NetworkException (String message، Throwable reason) {super (message، reason) ؛ } / ** * تُنشئ {code NetworkException} بالسبب المحدد. * *param سبب خطأ. * / public NetworkException (Throwable reason) {super (reason)؛ }}

UsageExample.java

/ ** * تُظهر الفئة {code UsageExample} استخدام {link Server} و {link Client}. تستخدم هذه الأمثلة * {link Thread # sleep (long)} لضمان تنفيذ كل مقطع لأن البدء والإغلاق بسرعة يتسببان في عدم تنفيذ بعض المقاطع *. * *version 1.0 *see Server *see Client * / public class UsageExample {public static void main (String args) يطرح استثناء {String host = "localhost"؛ منفذ int = 10430 ؛ خادم الخادم = خادم جديد (مضيف ، منفذ) ؛ عميل العميل = عميل جديد (مضيف ، منفذ) ؛ Thread.sleep (100 لتر) ؛ client.send ("مرحبًا") ؛ server.broadcast ("Hey، fella!") ؛ Thread.sleep (100 لتر) ؛ server.disconnect (server.getConnections () [0]) ، // أو client.close () لقطع الاتصال من جانب العميل server.close () ؛ }}

موصى به: