مفهوم برمجة الشبكات في جافا:
الشبكة تعني Network في اللغة الإنجليزية، الفكرة الأساسية من الشبكات هي ربط الأجهزة على اختلاف أنواعها مع بعض لخلق نوع من التواصل فيما بينهم. فمثلاً الأجهزة الموصولة على الشبكة سواء كانت كمبيوترات أو هواتف أو سيرفرات، يمكنها مشاركة البيانات مع بعضها البعض بواسطة برامج معينة.
برمجة الشبكات (Network Programming)تعني كتابة برنامج يشارك بياناته مع برنامج آخر من خلال شبكة.
في العادة يكون برنامج مثبَّت على السيرفر وبرنامج مثبَّت عند المستخدم العادي.
الفكرة هنا بناء برامج للمستخدمين تجعلهم قادرين على التواصل مع بعضهم ومشاركة البيانات فيما بينهم.
عندما نقول مشاركة البيانات من خلال شبكة، نقصد بذلك أنَّ الكمبيوتر سيشارك بياناته مع كمبيوتر آخر.
يمكن أن يكون كِلا الكمبيوترات موجودين على نفس الشبكة ويمكن أن يكون كل كمبيوتر منهم في بلد مختلف (لا يهم).
لبناء برامج يمكنها مشاركة البيانات مع بعضها عبر الشبكات، نستخدم الحزمة java.net التي تحتوي على مجموعة ضخمة من الكلاسات والإنترفيسات المصمَّمة خصيصاً لمشاركة البيانات عبر الشبكات.
ما الفائدة من بناء برامج تتواصل مع بعضها من خلال الشبكة؟
- مشاركة البيانات بين مختلف المستخدمين على الشبكة.
- تجميع البيانات التي نريد مشاركتها في مكان واحد، الأمر الذي يجعلنا قادرين على التحكم في طريقة مشاركة هذه البيانات.
افكار لبرامج تعمل على الشبكة:
يوجد أفكار كثيرة لبرامج يستخدمها الناس لمشاركة بياناتهم والتي يمكنك بناءها بنفسك أيضاً، أمثلة:
- برنامج محادثة مثلwhatsapp ,yahoo : Telegram,,MSN.
- متصفح حيث يمكن بناء متصفح مثل: Google Chrome, Opera Mini, Internet Explorer, Mozilla, Firefox
- ألعاب حيث يمكنك بناء لعبة يستطيع فيها اللاعبين تحدي بعضهم عن بعد.
- برنامج اختبار، مثلا يمكنك بناء برنامج يجعل الطالب قادراً على إجراء أي امتحان عن بعد وارساله الى مركز المؤسسة التعليمية الرئيسية عند الانتهاء.
مصطلحات أساسية في عالم الشبكات:
سنتطَّرق إلى بعض المصطلحات التي تفيدنا في الشبكات وهي:
NIC : اختصار ل Network Interface Card ومعناه كرت الشبكة.
MAC: اختصار ل Media Access Control Address هو عبارة عن رقم كرت الشبكة الخاص بالجهاز، حيث كل كرت شبكة يمتلك mac address موحد.
Mac address يتألف من bytes12 كل byte يمكن أن يكون رقم بين 0 و 9 أو حرف بين A،F .
IP Address: اختصار ل Internet Protocol Address و هو عبارة عن عنوان مؤقت يتم إعطائه لأي جهاز يريد الاتصال بالشبكة.
كل جهاز يريد الاتصال بالشبكة يتم إعطائه IP Address مختلف.
الـ IP Address يتألف من أربعة أرقام، كل رقم فيهم ي مكن أن يكون بين 0 و255.
في العربية أيضاً نقول بروتوكول، وهو عبارة عن مجموعة قواعد أساسية يجب إتباعها في كل عملية تواصل.
في عالم الشبكات يوجد بروتوكولات كثيرة، كل واحد منهم مصمم لغرض معين.
أشهر البروتوكولات:
TCP: يُستخدم عند نقل بيانات على الشبكة، يضمن وصولها إلى الجهة المطلوبة كما هي تماماً.
UDP: يُستخدم عند نقل بيانات على الشبكة، لا يهمه إذا فقد جزء من البيانات التي تم إرسالها.
HTTP: يستخدمه المتصفح عندما تقوم بتصفح المواقع.
FTP: يُستخدم عند تحميل أي نوع من الملفات.
TELNET: يُستخدم للتحكم في البرامج عن بعد.
POP3: يُستخدم من قبل العميل لاستقبال الرسائل إلكترونية الواردة في بريده مع إمكانية حذفها.
SMTP: يُستخدم من قبل العميل لإرسال رسائل إلكترونية إلى السيرفر.
Port number: وهو رقم البورت، كل برنامج يرسل أو يستقبل بيانات على الشبكة يحتاج أن يفتح بورت خاص فيه على الجهاز.
رقم البورت يُتيح للمستخدم استخدام أكثر من برنامج يتعاملون مع الشبكة في نفس الوقت. إذاً رقم البورت يميز البرامج التي تستخدم الشبكة عن بعضها البعض.
URL: اختصار ل Uniform Resource Locatorو يعني كل المعلومات المذكورة في الرابط والتي تشير إلى مصدر محدد للبيانات.
المعلومات الاساسية في أي رابط:
protocol://prefix.domain:port/path/filenamZ
Protocol: نضع مكانها اسم البروتوكول المستخدم في عملية الاتصال.
Prefix: نضع مكانها عادة www.
Domain: نضع مكانها اسم الموقع.
Port: نضع مكانها بورت البرنامج أو البروتوكول المستخدم من قبل العميل.
Path: نضع مكانها اسم المجلد الذي نريد الدخول إليه على السيرفير.
Filename: نضع مكانه اسم الملف الذي نريد تصفحه أو تحميله.
Socket: وهي عبارة عن مجموعة الكلاسات التي يمكن إستخدامها لإنشاء برامج تجعل المستخدمين قادرين على التواصل فيما بينهم بشكل متزامن عبر شبكة النت. وهي تضمن المعلومات الأساسية التي نحتاجها لإجراء أي عملية إتصال:
Socket = IP Address + Port Number + Protocol
خلاصة القول يمكن الوصول لأيِّ جهاز على الشبكة من خلال الـ IP Address الخاص فيه.
وكل تطبيق يتعامل مع الشبكات سواء لإرسال أو استقبال بيانات يحتاج إلى رقم بورت خاص فيه ليميزه عن باقي البرامج التي تستخدم الشبكة.
الكلاسات التي نحتاجها للتعامل مع الشبكات في جافا:
Public class URL: هذا الكلاس مصمَّم بشكل عام لتجهيز روابط الملفات التي سنتعامل معها عن بعد عبر شبكة الإنترنت.
Public calss URLConnection: هذا الكلاس عبارة عن Abstract Class وهو يُستخدم للقراءة والكتابة في الملف الذي يشير له URL بالإضافة الى انه يمكننا من معرفة وتحديد كافة المعلومات المتعلقة بإجراء الاتصال مع الملف، فمثلاً يتيح لنا معرفة آخر مرة تمَّ فيها تحديث الملف، تاريخ صلاحية الملف، اسم الكلاس المناسب لإرسال المعلومات منه واستقبالها فيه.
Public class InetAddress: هذا الكلاس مصمَّم لتحليل عنوان الجهاز أو الموقع الذي نُحاول الاتصال به عن بعد عبر شبكة النت.
Public class socket + public class server socket: الـ Socket عبارة عن مجموعة من الكلاسات التي يُمكن استخدامها لإنشاء برامج تجعل المستخدمين قادرين على التواصل فيما بينهم بشكل متزامن عبر شبكة النت، لذلك تعتبر أهم كلاسات موجودة في الحزمة java.net وهي تنقسم لقسمين أساسيين:
- كلاسات مخصصة لبناء برامج تستخدم البروتوكول UDP.
- كلاسات مخصصة لبناء برامج تستخدم البروتوكول TCP.
تعدُّد المهام في جافا:
مفهوم تعدُّد المهام: عندما تستخدم هاتفك أو حاسوبك، ترى أنَّه يمكنك تشغيل عدِّة برامج مع بعض في وقتٍ واحد، كل برنامج شغال في الذاكرة يُعتبر Process، فمثلاً إذا قمت بتشغيل خمسة برامج مع بعض فهذا يعني أنَّ نظام التشغيل يُنظِّم عمل خمسة Processes مع بعض. آلية تشغيل عدة برامج مع بعض تُسمى Multiprocessing.
من جهة أخرى، في البرنامج الواحد يمكنك تنفيذ عدِّة أوامر مع بعض وجعل المستخدم يشعر كأنَّها تتنفذ في وقت واحد، فمثلاً في حال كنت تلعب لعبة مثل لعبة كرة القدم، تجد أنَّه هناك عدة أشياء تحدث في وقت واحد، فمثلاً عند تشغيل اللعبة تسمع عدة أصوات (مثل أغنية حماسية، صوت المعلق، صوت المشجعين، صوت صفارة الحكم في حال وقع خطأ إلخ..)، بالإضافة إلى أنَّه يمكنك تحريك اللاعب ومشاهدة توقيت المباراة والكثير من التفاصيل الأخرى التي تحدث كلها في نفس الوقت لتصنع لك لعبة رائعة. هذه الآلية تسمى Multithreading لأنَّ كل جزء شغال في البرنامج يكون عبارة عن مجموعة أوامر موضوعة بداخل Thread خاص.
إذاً نستخدم آلية Multithreading لجعل البرنامج قادر على تنفيذ عدة أوامر مع بعض وكأنها تتنفذ في وقت واحد
الفرق بين process و Thread
Process: تعني برنامج شغال حالياً، وقد قام نظام التشغيل بحجز مساحة خاصة له في الذاكرة.
Thread: في نفس الوقت في البرنامج، ويمكن أيضاً مشاركة المعلومات بينهم. مع ملاحظة أنه يتم إنشاء جميع الـ Threads من ضمن المساحة المحجوزة ل Process في الذاكرة.
فوائد تعدد المهام
- جعل المستخدم قادر على تنفيذ عدة عمليات مع بعض في نفس الوقت.
- جعل تصميم التطبيقات أجمل واضافة مؤثرات فيه.
- كل Thread تقوم بتشغيله يعمل بشكل منعزل عن باقي الأوامر الموجودة في البرنامج وبالتالي فإنَّه في حال وقوع أي خطأ في ال Thread فإنَّه لن يؤثر على باقي الأوامر الموجودة في البرنامج كما أنَّه لا يؤثر على أي Thread آخر شغال في البرنامج.
دورة حياة ال Thread في جافا:
الـ Thread لا يعمل مباشرةً عند إنشاءه، بل يمر بعدة مراحل تباعاً حتى يعمل وينفذ الأوامر الموضوعة بداخله، وهو ينتقل من مرحلة إلى أخرى من خلال دوال معينة كما في الصورة التالية.
- المرحلة New: هي المرحلة التي يتم فيها إنشاء كائن الـ Thread.
- المرحلة Runnable: تبدأ هذه المرحلة بعد استدعاء الدالة run وهي تعني أن كائن الـ Thread جاهزاً لينفذ الأوامر الموضوعة فيه.
- المرحلة Runninig: تبدأ هذه المرحلة بعد استدعاء الدالة start وهي تعني أن كائن الـ Thread يبدأ بتنفيذ الأوامر الموضوعة فيه.
- المرحلة waiting: تبدأ هذه المرحلة بعد استدعاء الدالة wait sleep وهي تعني أن كائن الـ Thread متوقف لمدة معينة.
- المرحلة Dead: يقال لها Terminated أيضاً، وهي تعني إيقاف كائن الـ Thread كلياً عن العمل و مسحه من الذاكرة، تبدأ هذه المرحلة بعد استدعاء الدالة interrupt.
مفهوم ال Main Thread
عندما تقوم بتشغيل أي برنامج في جافا، فإنَّ جافا تعامله كـ Thread لأنَّ كل برنامج تقوم بإنشائه يمر بالمراحل التي ذكرناها.
فمثلاً, تخيل أنَّك قمت ببناء برنامج بسيط يطلب من المستخدم إدخال عددين، بعدها يقوم البرنامج بطباعة ناتج هذين العددين للمستخدم، هنا سيحدث التالي عند تشغيله:
- سيتم فحص كود البرنامج للتأكد من عدم وجود خطأ.
- بعدها سيتم البحث عن الدالة main التي تعتبر نقطة البداية في البرنامج.
- بعدها سيتم تنفيذ الأوامر الموضوعة في الدالة mainبالترتيب الموضوعين فيه وبالتالي يطلب البرنامج من المستخدم ادخال عددين.
- بعدها سيقوم البرنامج بانتظار المستخدم لإدخال العددين.
- بعد ادخالهما سيقوم بجمع العددين وطباعة الناتج وعندها ينتهي البرنامج ويتم مسحه من الذاكرة بشكل تلقائي.
الكلاسات المصممة للتعامل مع ال Thread:
Public class thread: يمكنك إنشاء الـ Thread من خلال وراثة الكلاس Thread.
Public interface Runnable: المشكلة الوحيدة التي تواجهها عند إنشاء الـ Thread من خلال وراثة الكلاس Thread هي أنَّ الكلاس يصبح غير قادر على أن يرث من كلاس آخر، لأنَّ جافا لا تدعم تعدُّد الوراثة، وبالتالي لا يستطيع الكلاس أن يفعل extends لأكثر من كلاس.
لحل مشكلة تعدد الوراثة، يمكنك جعل الكلاس يفعل implements للإنترفيس Runnable وتنشئ كائن من الكلاس Thread بداخله.
Public class thread group: يمكنك أيضاً استخدام الكلاس ThreadGroup لإنشاء أكثر من Thread ووضعهم في مجموعة واحدة، مما يجعلك قادراً على التعامل معهم جميعاً دفعة واحدة.
نهاية لقد رأينا لغة جافا في عالم الشبكات وماهي الكلاسات التي تتعامل معها للبرمجة وتطرقنا إلى مفهوم تعُّدد المهام في لغة البرمجة جافا وسنكمل لاحقاً التعامل مع قواعد البيانات في جافا وعدة أمور أخرى.