السلام عليكم ورحمة الله
كثرت - في الآونة الأخيرة - الأسئلة التي تدور في فلك كيفية الاتصال بين أكثر من برنامج زبون مع برنامج السيرفر، وبالرغم من وجود ردود لا بأس بها على هذه الأسئلة
إلا أنها غالباً لا تكون صحيحة 100% ، فمثلاً من ضمن تلك الأسئلة :-
أريد أن أجعل برنامج السيرفر يقبل أكثر من عشرة اتصلات لإجهزة الشبكة مثبت عليها برنامج الزبون فماذا أفعل ؟
وتجد الرد على هذا السؤال كالتالي :
ضع عشرة نسخ من أداة وينسوك على النموذج الخاص بالسيرفر واجعل كل برنامج زبون يقوم بالاتصال بأداة واحدة من تلك الأدوات العشرة .
أو :-
ضع أداة وينسوك واعمل منها مصفوفة وضع بعدها ( 9 ) أخرى ............ وهكذا .
والسؤال المهم هنا :-
كيف سيكون الحال إن كان المطلوب هو اتصال ( 100 ) مائة جهاز في الشبكة أو أكثر على برنامج السيرفر ؟
وهل سنضع 100 أداة وينسوك - سواء بشكل منفرد أو على شكل مصفوفة - على نموذج السيرفر ؟
والإجابة بالطبع = ممكن .
لكن ما الوقت الذي يتطلبه هذا النموذج للتحميل ؟ إضافة إلى وجود أدوات أخرى بالطبع عليه ؟
وما حجم الذاكرة المطلوبة لإستيعاب كل تلك الأدوات ؟
للإجابة على هذه الأسئلة تابع معي وتعلم الطريقة الصحيحة لعملية الاتصال بين برنامج الزبون وبرنامج السيرفر :
مع ملاحظة :- أنني لن أتحدث هنا عن ماهية البروتوكول المستخدم في الشبكات ولا عن المنافذ والمآخذ ولا فهم نظم التشغيل ، مع مراعاة أن فهم كل تلك الأشياء التي لن أتحدث عنها هي الطريق الوحيد للتمكن من برمجة الشبكات .
دعونا نبدأ - بسم الله
إعداد برنامج السيرفر :
ضع أداة وحيدة من وينسوك ( Winsock ) على النموذج ثم عين القيمة ( 0 ) صفر للخاصة Index بعد تسمية الأداة باسم WskServer .
والهدف من تعيين القيمة ( 0 ) للأداة هو جعلها مصفوفة ولكن دون وضع أي نسخ أخرى منها على النموذج .
في قسم التصريحات العامة للنموذج اكتب الكود التالي :-
Const MaxConnection As Integer = 100
شرح الكود :
قمنا بتعريف ثابت مهمته تعيين الحد الأقصى لعدد التصالات المسموح بها من برنامج الزبون وجعلنا قيمته = 100 اتصال ، أي يمكن لبرنامج السيرفر قبول الاتصال من برنامج الزبون لمائة جهاز على الشبكة .
في حدث تحميل نموذج السيرفر اكتب الكود التالي :
WskServer ( 0 ).LocalPort = 2233 WskServer ( 0 ).Listen
شرح الكود :
حيث أن أداة وينسوك ستعمل كمصفوفة فلقد قمنا بتعيين العنصر ( 0 ) من المصفوفة ليعمل كمستمع للاتصالات القادمة على المنفذ رقم 2233 .
والآن اضغط ضغطاً مزدوجاً على أدادة وينسوك لفتح نافذة محرر الكود واختر من قائمة الاحداث الحدث ConnectionRequest ، وهذا الحدث هو الخاص بطلب الاتصال وقبوله من برنامج الزبون .
اكتب الكود التالي في هذا الحدث :
Dim IntIndex As Integer Dim Wsk As Winsock If Index <> 0 Then Exit Sub IntIndex = 1 For Each wsk In WskServer If Wsk.index > 0 Then If IntIndex < Wsk.Index Then Exit For IntIndex = IntIndex + 1 End If DoEvents Next Wsk If IntIndex > MaxConnection Then Exit Sub Load WskServer ( IntIndex ) WskServer ( IntIndex ).accept requestID
شرح الكود
يعد هذا الكود اهم اكواد عملية الاتصال بين برنامج الزبون وبرنامج السيرفر ففى السطر الاول والثانى من الكود صرحنا عن متغيرين ، الاول سيحمل رقم عنصر المصفوفه والثانى يحمل اداة الاتصال 0
فى السطر الثالث اختبرنا قيمة فهرس الاداة ، فاذا كانت لا تحمل العنصر رقم صفر عندها يتم الخروج من الاجراء 0
فى السطر الرابع جعلنا قيمة المتغير الذى سيحمل رقم عنصر المصفوفة = ( 1 ) ثم بعد ذلك قمنا بعمل حلقة تكرارية لعناصر الاداة المحملة بالذاكرة حاليا ومن ثم زيادة عناصر المصفوفة بعنصر جديد 0
بعد نهاية الحلقة قمنا بالتاكد من عناصر الاداة بانها لم تتخطى العدد الكلى والمصرع عنه كثابت وهو ( 100 ) فى مثالنا ، فاذا كان العنصر الجديد قد تخطى هذا الرقم يتم الخروج من الاجراء ، فاذا لم يكن قد تخطاه نقوم فى السطر التالى بتحميل عنصر جديد من الاداة فى الذاكرة وقت التشغيل وفى النهاية يتم توجيه هذا العنصر ( الجديد ) لقبول الاتصال 0
ملاحظة :- لا تنسى ان تلفت نظر المستخدم لقبول هذا الاتصال باظهار تلميح او رسالة او ايقونة او ما شابه ذلك
بهذا نكون قد حملنا الاداة عند اللزوم فقط بما يعنى انه لا داعى لحجز ذاكرة لاداة لا تعمل حاليا 0
والسؤال الان :- نفرض انه كان هناك ( 50 ) جهاز متصلون بالسيرفر ثم خروج 20 جهاز منهم بما يعنى علميا اغلاق وإنهاء 20 عنصر من عناصر المصفوفة ولا زالو محجوزين في الذاكرة 0
لذلك سنكتب التالي :
اختر من قائمة الأحداث الحدث إغلاق Close واكتب فيه الكود التالي :
If WskServer ( Index ).State <> sckClosed Then WskServer ( Index ).Close End If Unload WskServer ( Index ) End If
أعتقد أن الكود السابق لا يحتاج لمزيد من الشرح ، حيث أننا قمنا بالتأكد من إغلاق الاتصال ثم قمنا باإلغاء تحميل عنصر مصفوفة الأداة ، إضافة إلى تفريغ منطقة المصفوفة لإجل تحميل عنصر آخر عندما يتم مستقبلاً طلب الاتصال مرة آخرى .
بهذا نكون قد انتهينا من عمليتي الاتصال والإغلاق في برنامج السيرفر وهيا بنا لنرى كيف تتم عملية طلب الاتصال من برنامج الزبون إلى برنامج السيرفر .
برنامج الزبون :
ضع أداة وحيدة من وينسوك ( Winsock ) على نموذج الزبون وسمها WskClient .
افتح نافذة محرر الكود وقم بعمل إجراء جديد باسم ConnectToServer واكتب فيه الكود التالي بحيث يصبح كامل الإجراء بالشكل التالي :
Private sub ConnectToServer ( ) With WskClient If .State <> sckClosed Then .Close .RemoteHost = "127.0.0.1" .RemotePort = 2233 .Connect End With End Sub
شرح الكود
أول سؤال قد يخطر على بالك : لماذا قمنا بعمل إجراء خاص لعملية الاتصال ولم نقم مثلاً بكتابة كود الاتصال في حدث تحميل النموذج ؟
والإجابة على هذا السؤال ستأتيك بعد شرح الكود :
تحققنا أولاً من حالة الأداة ، فإذا لم تكن مغلقة نقوم باستدعاء الطريقة Close لإغلاق الاتصال .
ثم قمنا بتجهيز خاصيتي Remotehost و RemotePort واللتان يمكن تجهيزهما في أي نقطة تسبق عملية الاتصال .
1- خاصية Remotehost تمكننا من تعين اسم الكمبيوتر البعيد أو عنوان IP Address لذلك الكمبيوتر ، وفي مثالنا هنا قمنا بتعيين هذه الخاصية على نفس عنوان الكمبيوتر المحلي ، ويراعى طبعاً تغييرها عند وجود شبكة محلية فعلية .
2- خاصية RemotePort هي الخاصية هي المسئولة عن تحديد منفذ الاتصال الذي يستمع اليه برنامج السيرفر .
يراعى أن تغيير هذا المنفذ في برنامج السيرفر يستلزم تغييره في البرنامج الزبون وإلا فإن محاولة الاتصال ستبوء بالفشل .
ملاحظة هامة :- أرقام المنافذ من رقم ( 1 ) وحتى رقم ( 1023 ) منافذ محجوزة لمهام أخرى .
وأخيراً قمنا بعملية الاتصال عن طريق خاصية الاتصال للأداة .
جاء دور الإجابة على السؤال : لماذا جعلنا طلب الاتصال في إجراء مستقل ؟
من الممكن طبعاً وضع عملية الاتصال في حدث تحميل النموذج لكن ماذا ستفعل في حال كان برنامج السيرفر لا يعمل عند بدء تحميل نموذج الزبون ؟
في هذه الحالة لن يتم طلب وقبول الاتصال حتى تعيد تشغيل البرنامج الزبون مجدداً ، لهذا فقد قمنا بإنشاء إجراء مستقل حتى نتمكن من استدعاء هذا الإجراء في أي وقت نريده
قم بوضع مؤقت Timer وسمه Tmrreconnect واجعل خاصية Interval = 30000 بحيث يتم استدعاء الإجراء كل نصف دقيقة .
اضغط ضغطاً مزدوجاً على المؤقت لفتح نافذة محرر الكود واكتب فيها الشيفرة التالية :-
If WskClient.State <> 7 Then Call ConnectToServer End If
شرح الكود
نقوم في هذا الكود باختبار حالة الاتصال فإذا لم تكن حالته = متصل يتم استدعاء إجراء الاتصال .
وبذلك نتمكن من الاتصال بالبرنامج السيرفر في أي وقت يبدأ فيه العمل سواء كان يعمي أثناء تشغيل برنامج الزبون أو بدء العمل بعد تشغيل برنامج الزبون .
يبقى لنا أن نجعل برنامج الزبون يقوم بطلب الاتصال عند بدء تشغيله وذلك بنداء اجراء الاتصال في حدث تحميل النموذج وذلك كما يلي :-
Call connectToServer
في الناهية أحب أن أنوه إلى أمر هام في برمجة الشبكات وهو :
إن أردت أن تقوم بتطوير برنامج قوي للتعامل مع الشبكات فعليك الإلمام الجيد بثلاث أشياء قبل الشروع في العمل هي :
1- نظم التشغيل - ليس من منظور المستخدم العادي بل من منظور مبرمج
2- الشبكات
3 - المستخدم
وطبعا الحديث عن تلك الاشياء يطول .
أرجو أن أكون قد وفقت في إضافة معلومة ولو بسيطة إلى معلوماتكم ؟
لمزيد من المقاللات حول الشبكات والتعامل مع الالات والمعدات - انتظرونا قريباً على موقعنا .
والله أعلى وأعلم