![]() |
|
سلسلة دروس في إحتراف الوينسوك ( موضوع متجدد ) - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم لغات البرمجة الاخرى (http://vb4arb.com/vb/forumdisplay.php?fid=4) +--- قسم : قسم لغة vb6.0 (http://vb4arb.com/vb/forumdisplay.php?fid=18) +---- قسم : قسم مقالات vb6.0 (http://vb4arb.com/vb/forumdisplay.php?fid=29) +---- الموضوع : سلسلة دروس في إحتراف الوينسوك ( موضوع متجدد ) (/showthread.php?tid=4178) |
سلسلة دروس في إحتراف الوينسوك ( موضوع متجدد ) - Ahmad Jawad - 17-09-12 بسم الله الرحمن الرحيم
دورة إحتراف الوينسوك المحتويات : شرح الوينسوك . برمجة برنامج بسيط بواسطة الوينسوك . عمل إتصال عكسي . برمجة برنامج محادثة. مشروع نقل الملفات المباشر . مشاريع متطورة مفتوحة المصدر تستخدم الوينسوك وهي منقولة من مواقع أجنبية وعربية . بإذن الله ستجدون شروحات الأكواد بطريقة رائعة ، والبرامج التي يتم تصميمها منفصلة وتستطيعون برمجة كل واحد على حدة . في هذه المقالة توجد فكرة طاغية على مجمل موضوعاتها وهي الإتصال العكسي ، لأنه هي التقنية المستخدمة في كل البرامج الحديثة ، ولكن لا مانع من شرح الإتصال المباشر كنوع من الفائدة وزيادة المعلومات ، وليس لأنها فقط للفائدة يعني أن لا يقوم القارئ بالإطلاع عليها ، بالعكس هي ضرورية أكثر من الإتصال العكسي لأنها هي الأساس في الإتصال . [COLOR="#FF0000"] الدرس الأول : الجزء الأول : [/COLOR] شروحات الوينسوك تختلف من شخص لآخر ، فكل منا يفهمها حسب طريقته . الوينسوك هي أداة مرفقة مع الفيجيول بيسيك تقوم بعمل شبكة محلية مكونة من : اقتباس: عميل / خادم . عميل / عميل . وقد تستخدم للتحكم في الأجهزة عن بعد ، أو حتى للربط بين برنامجين في نفس الحاسوب ، الوينسوك تقوم بتنفيذ الأوامر فقط ، أي أنها لا تستطيع فتح سواقة الأقراص بدون أوامر خارجية ، فللوهلة الأولى يظن المبرمج أن الوينسوك تقوم بجميع المهمات الصعبة ، ولكن هي بالحقيقة لا تقوم سوى بعدة أوامر ومنها : الإتصال . إقتباس : نقل البيانات SendData . بالنسبة للوينسوك ، فهناك مشكلة عدم وجودها مع إصدارات الويندوز ، و يحتاج المبرمج إلى إرفاقها أو دمجها مع برنامجه لكي يعمل . ويمكن أيضا برمجتها بواسطة دوال API وإنشاء الــ Sockets . [COLOR="#FF0000"]الشرح : [/COLOR] الإتصال ( Connect ) : في حدث الإتصال يلزم 4 أمور رئيسية : اقتباس: 1- إغلاق أي إتصال سابق 2- تحديد المنفذ . 3- تحديد عنوان الأي بي IP Address . 4- الإتصال. سؤال يطرح نفسه : لماذا يجب إغلاق أي إتصال سابق ؟؟ لكي يتم تجديد الإتصال ، و إغلاق أي إتصال غير مكتمل وأي إتصال قديم. وتتم عملية الإتصال كالتالي : PHP كود : Winsock1.close إقتباس : في الخادم : عند الإتصال المباشر من العميل إلى الخادم . الإنصات ( Listen ) : عملية الإنصات هي حجز المنفذ الذي سيتم تلقي طلب الإتصال من خلاله وتكون بخطوتين : اقتباس: تحديد المنفذ . الإنصات . وتتم كالتالي : PHP كود : Winsock1.LocalPort = 303 عملية الإنصات أيضا من الممكن أن توضع في كلا البرنامجين ( العميل / الخادم ) . قبول طلب الإتصال ( Accept ) : تتم عملية قبول طلب الإتصال بخطوتين : إقتباس : إغلاق أي إتصال جديد . وتتم كالتالي : PHP كود : Winsock1.close وتوضع شيفرة قبول طلب الإتصال في حدث الوينسوك Connection Request . تحديد البروتوكول : بروتوكولات الوينسوك عبارة عن بروتوكولين مختلفين تماما وهما : إقتباس : TCP . البروتوكول TCP : يستخدم إجراءات تأكيد وصول البيانات كاملة وعند فشل الإرسال تتم الإعادة من جديد . البروتوكول UDP : يعمل على توصيل البيانات بسرعة بدون التحقق من فشل الإرسال أو لا . ولكن البروتوكول المعتمد في الإتصال والتواصل هو TCP ويكون في الغالب هو الأصل . وتتم عملية تحديد البروتوكول كالتالي : PHP كود : Winsock1.Protocol = sckTCPProtocol PHP كود : Winsock1.Protocol = sckUDPProtocol إرسال البيانات ( SendData ) : تتم عملية إرسال البيانات لكي يقوم الخادم بتنفيذ الأوامر المطابقة للبيانات المستلمة . وتتم بخطوتين : إقتباس : تجاوز الخطأ عند وجود أي خطأ . كالتالي : PHP كود : On Error Resume Next إستقبال البيانات ( GetData ) : تتم عملية إستقبال البيانات بخطوتين في الأغلب وهي : اقتباس: تعريف متغير يحمل قيمة نصية . إسناد البيانات المستقبلة إليه . وتكون كالتالي : إقتباس :Dim Data as String وتوضع شيفرة إستقبال البيانات في حدث الوينسوك DataArrival . ومن الممكن عمل جملة Select case إذا كانت البيانات القادمة كثيرة . إضافة الأداة : تتم إضافة الأداة إلى المشروع كالتالي : اقتباس: ctrl + T > Microsoft Winsock Control 6.0 الجزء الثاني : برمجة برنامج بسيط بواسطة الوينسوك بعد إعتماد شرح الوينسوك السابق ، دعونا ننتقل إلى المستوى الأعلى ، وهو برمجة الإتصال أولا :ً برمجة الإتصال المباشر ( من العميل إلى الخادم ) : العميل : في برنامج العميل نحتاج للأدوات التالية : أداة الوينسوك . 2 صندوق نص واحد لعنوان الأي بي ، والآخر للمنفذ . 3 ليبل . تايمر ( Interval = 1 ) 2 زر كوماند واحد للإتصال وواحد لقطع الإتصال . ونسقها لتصبح على شكل برنامج محادثة . كتابة النص البرمجي : العميل : في زر الأمر ( إتصال ) : PHP كود : On Error Resume Next حيث إنه تم طلب الإتصال عبر المنفذ 303 بعنوان الآي بي إفتراضي وهو 127.0.0.1 والموجودان في صندوقي النص Text1 , Text2 . في زر الأمر ( قطع الإتصال ) : PHP كود : On Error Resume Next في التايمر : PHP كود : Dim State تم الإنتهاء من العميل . الخادم : في برنامج الخادم نحتاج لأداة الوينسوك فقط . النص البرمجي : في كود تحميل الفورم : PHP كود : Winsock1.Close حيث إنه يتم إغلاق كل الإتصالات ، وتم تحديد المنفذ 303 ليكون منفذ الإنصات . في الحدث Connection_Request للوينسوك : PHP كود : On Error Resume Next حيث إنه يتم إغلاق جميع الإتصالات ، ويتم قبول طلب الإتصال Accept . تم الإنتهاء من الخادم . وتستطيع تجربة البرنامج وفحص الإتصال . يتبع ...... سلسلة دروس في إحتراف الوينسوك ( موضوع متجدد ) - Ahmad Jawad - 17-09-12 الدرس الثاني
العميل : ثانيا:ً برمجة الإتصال العكسي ( من الخادم إلى العميل ) : الإتصال العكسي هو جعل الخادم يتصل بالعميل . في برنامج العميل نحتاج للأدوات التالية : أداة الوينسوك . صندوق نص واحد ( للمنفذ ) . تايمر ( Interval = 1 ) . ليبل . النص البرمجي : في كود تحميل الفورم : PHP كود : Winsock1.Close • إجعل المنفذ ( 303 ) . حيث إنه يتم إغلاق جميع الإتصالات ، ويتم تحديد منفذ الإتصال والإنصات ، وبعدها يتم أمر الإنصات عبر المنفذ المحدد . في الحدث Connection_Request للوينسوك : PHP كود : On Error Resume Next تم الإنتهاء من برنامج العميل ونقوم بوضع كود فحص حالة الوينسوك في التايمر . الخادم : في الخادم نحتاج للأدوات التالية : أداة الوينسوك . تايمر ( Interval = 3000 ) . 2 صندوق نص الأول لعنوان الأي بي والآخر للمنفذ . يكون عنوان الأي بي إفتراضيا أيضا وهو 127.0.0.1 والمنفذ 303 كما تم تحديده في العميل . النص البرمجي : في المؤقت Timer : قمنا بجعل الخاصية ( Interval = 3000 ) لكي يقوم بتجربة الإتصال كل 3 ثواني . PHP كود : If Text1.Text = "" Or Text2.Text = "" Then Exit Sub يقوم التايمر بفحص القيم والحالات في صندوقي النص Text1 , Text2 وفي الوينسوك حسب الحالات التالية : إقتباس : إذا كان كلاهما فارغاً أو أحدهما فارغ ، فإنه لا يقوم بأي مهمة . وإن كانت الشروط مخالفة لجمل الشرط ، فيقوم التايمر بإغلاق الوينسوك ( إغلاق الإتصالات الحالية ) ، وإجراء إتصال جديد . تم الإنتهاء من الخادم . تستطيع الآن تجربة البرنامج وفحص الإتصال . يتبع ..... سلسلة دروس في إحتراف الوينسوك ( موضوع متجدد ) - Ahmad Jawad - 17-09-12 الدرس الثالث
الجزء الأول : برمجة برنامج محادثة . برامج المحادثة هي البرامج الأكثر شيوعاً بين مبرمجي الإتصالات بواسطة الوينسوك ، لأنها تجربة ممتعة وشيقة ونوعية وتعتبر نقلة نحو الأفضل . فكرة البرنامج : إقتباس : الإعتماد على إرسال واستقبال البيانات . المميزات : اقتباس: يعمل بتقنية الإتصال العكسي . قابل للتطوير ليصبح قادرا على إستقبال أكثر من شخصين . ضروريات لبرنامج المحادثة : نستطيع في برنامج المحادثة إرسال البيانات بهذه الصورة PHP كود : Winsock1.sendData Text1.text ولكن هي ليست الطريقة الوحيدة وليست أيضا الأفضل ، إذ يوجد طرق عديدة لنقل البيانات بصورة مرتبة أكثر ومضمونة وموثوقة بشكل أكبر . خطوات إرسال البيانات في برنامج المحادثة ( وليست الطريقة الوحيدة ) . اقتباس: تعريف ( إجراء Sub ) مهمته الإرسال . كتابة البيانات في صندوق نص . إرسال البيانات ، وعرضها في صندوق المحادثة + الإسم . خطوات إستقبال البيانات : إقتباس : تعريف متغير من يحمل قيمة نصية .. ملاحظة : * إقتباس : هذه الخطوات هي شاملة لكلا الطرفين ( العميل والخادم ) . العميل : في برنامج العميل نحتاج للأدوات التالية : أداة الوينسوك . صندوقي نص الأول لعرض البيانات و تكون خصائصه كالتالي اقتباس: Multiline = true , Locked = true , Scrollbars = 2- vertical, Name = txtData. أما بالنسبة لصندوق النص الآخر فتكون خصائصه كالتالي : إقتباس :Name = txtSend و ليبل . تايمر ( Interval = 1 ) . زر أمر للإرسال . بالنسبة لأكواد الإتصال فهي مشروحة ، ويتوجب عليك إدراجها في النص البرمجي ، الآن سأقوم بشرح أكواد برنامج المحادثة فقط . النص البرمجي : في قسم التصريحات العامة : PHP كود : Sub SendData (data As String) حيث إنه عبارة عن إجراء يقوم بجعل الوينسوك ترسل البيانات عند إستدعاءه . في زر الأمر ( إرسال ) : PHP كود : If txtSend.Text <> "" Then حيث إنه يقوم بإستدعاء الإجراء SendData ويقوم بإرسال البيانات الموجوة في TxtSend . في الحدث Change الخاص بصندوق النص TxtData : PHP كود : txtData.SelStart = Len(txtData.Text) في الحدث DataArrival للوينسوك : PHP كود : Dim ChatData as String تم الإنتهاء من برنامج العميل . الخادم : في الخادم نحتاج للأدوات التالية : أداة الوينسوك . تايمر ( Interval = 3000 ) . ( نوع الإتصال : عكسي ) 4 صندوق نص . 1 زر كوماند . وتكون لها نفس الخصائص البرمجية في برنامج العميل . النص البرمجي : في قسم التصريحات العامة : PHP كود : Sub SendData (data As String) في زر الأمر ( إرسال ) : PHP كود : If txtSend.Text <> "" Then في الحدث Change الخاص بصندوق النص TxtData : PHP كود : txtData.SelStart = Len (txtData.Text) في الحدث DataArrival للوينسوك : PHP كود : Dim ChatData as String تم الإنتهاء من برنامج الخادم . الجزء الثاني : طريقة أخرى لبرنامج المحادثة : إذا كان برنامجك عبارة عن برنامج يستخدم وينسوك واحدة على الأقل ، ولديك العديد من البيانات لترسلها من العميل إلى الخادم ، فكيف يمكنك فصل البيانات الواردة في الخادم ، وتنفيذ كل منها على حدة ؟؟؟ سأقوم بجمع فكرتين في آن واحد : إقتباس : - فصل البيانات . - فصل البيانات : يتم فصل البيانات بعدة دوال ومنها Mid , Left , Right ، وفي موضوعنا سنستخدم الدالة Left + الدالة Right لفرض أن العميل أرسل الأمر Sip + محتوى صندوق نص على الشكل التالي : PHP كود : Winsock1.sendData "Sip" & Text1.text فإذا قمنا بإستقبال البيانات على هذا الشكل PHP كود : Winsock1.getData Data ووضعناها في MsgBox فإنه يتم عرض الأمر Sip في الرسالة ، وهذا ما لا نريده ، لذلك يجب إلغاء الأمر Sip من البيانات . مثال PHP كود : Dim Dat as String حيث إن : تم تعريف المتغير Dat لإسناد البيانات القادمة إليه . في الجملة الشرطية If يتم فحص المتغير Dat فإن كانت سلسلته النصية من جهة اليسار تحتوي على الأمر Sip فإنه يتم أخذ الجزء Right وإقتطاع 3 أحرف من طول السلسلة ، ووضع الباقي في صندوق نصي . وهكذا تجري الأمور . ---- برنامج المحادثة : في كلا البرنامجين نضع نفس الأدوات الموجودة في المثال السابق ، وطبعا يكون الإختلاف في الأكواد فقط . ولكن نقوم بإضافة زر أمر وصندوق نص في برنامج العميل لكي نوضح مثال فصل البيانات . سيكون المثال عبارة عن برنامج المحادثة + التحكم في شاشة Run ( من قائمة إبدأ ) . ويكون إسمه ( فتح التطبيق ) . النص البرمجي : معظم الأكواد هي نفسها في البرنامج السابق ولكن الإختلاف يكون في زر الأمر ( إرسال ) وزر الأمر الجديد ( فتح التطبيق ) . (قم بإضافة أكواد الإتصال إلى البرنامج ) . في زر الأمر ( إرسال ) : PHP كود : On Error Resume Next في زر الأمر ( فتح ) : PHP كود : On Error Resume Next في الحدث DataArrival الخاص بالوينسوك : PHP كود : On error resume next الخادم : في زر الأمر ( إرسال ) : PHP كود : On Error Resume Next في الحدث DataArrival الخاص بالوينسوك : PHP كود : On error resume next تم إنهاء برنامج المحادثة ، تستطيع تجربته مع أصدقائك . سلسلة دروس في إحتراف الوينسوك ( موضوع متجدد ) - Ahmad Jawad - 17-09-12 الدرس الثالث :
مشروع نقل الملفات من المعروف أن إرسال ملف حجمه 30 بايت أو 90 بايت هي عملية سريعة إذ تكون في نطاق قدرة الوينسوك على الإرسال ، ولكن ماذا نفعل إذا كان حجم الملف 1 ميغا بايت ( 1024 بايت ) ... هنا نصاب بالملل . الحل هو تقسيم الملف وإرسال كل جزء منه على حدة ، وتجميعها في ملف واحد في جهاز الخادم ، هذا بإختصار . أما العمليات التي تتم أثناء الإرسال فهي كالتالي : فتح الملف بصيغة ثنائية Binary : تتم عملية فتح الملف بهذه الصيغة بثلاث خطوات وهي : إقتباس : تعريف متغير جديد. وتكون كالتالي : إقتباس :Dim F حيث إن ( File ) هو إمتداد الملف . قراءة جزء معين من الملف : تتم عملية فتح الملف بهذه الصيغة بثلاث خطوات وهي : إقتباس : تعريف متغير جديد. PHP كود : Dim C حساب عدد ال Bytes : تتم عملية فتح الملف بهذه الصيغة بخطوتين : اقتباس: تعريف متغير جديد. حساب الحجم Lof . PHP كود : Dim A الكتابة على الملف Put : PHP كود : Put #F, , Data خطوات إرسال ملف : إقتباس : • برمجة إجراء ( Sub ) يحتوي على خوارزميات التقسيم والإرسال .. هذا بإختصار ،،،،،، تابع الشرح لتعرف أكثر : سأقوم بشرح إرسال ملف صغير الحجم ، ( في الغالب 10 كيلو بايت ، إن كان أكثر فلا يعمل الملف بعد الإرسال وذلك لأن الكود البرمجي ضعيف جداً في الإرسال ، ) وأنتظر منكم تطوير أنفسكم للأحسن . العميل : الأدوات : - الوينسوك - تايمر عدد 2 (الأول لتبيين حالة الوينسوك ، والثاني للإرسال Interval = 3000 ) - 3 صندوق نص ( الأول للمنفذ ، والبقية لإمتداد وإسم الملف ) . - أداة CommonDialog . - 2 زر كوماند ( الأول لفتح الملف ، والآخر للإرسال ) . نضبط الخاصية Index للوينسوك ونجعلها = 0 ( وذلك لإنشاء مصفوفة وينسوك ) والخاصية Enabled للتايمر ونجعلها = False . النص البرمجي : في قسم التصريحات العامة ، نعرف الإجراء SendFile . PHP كود : Sub SendFile (Index as Integer) في زر الأمر ( فتح الملف ) PHP كود : On Error Resume Next ملاحظة ( عند كتابة أكواد الإتصال في برنامج العميل _ يجب كتابة المقطع Index بداخل أقواس ( index ) بعد كلمة Winsock لأنه تم إنشاء مصفوفة ) مثال : PHP كود : Winsock1 (index).listen في التايمر ( 2 ) PHP كود : On Error Resume Next في زر الأمر ( إرسال ) : PHP كود : On Error Resume Next يقوم هذا المقطع بإرسال إسم الملف FileTitle الموجود في Text3 . ويقوم بتغيير الخاصية Enabled للتايمر لكي يقوم ب إرسال الملف بعد 3 ثواني . الخادم : الأدوات : - أداة الوينسوك . - تايمر . - 3 صناديق نص ( الأول لعنوان الأي بي ، والثاني للمنفذ و الثالث لإستلام إسم الملف). النص البرمجي : في قسم التصريحات العامة : PHP كود : Dim F as Integer في حدث الوينسوك Data Arrival : PHP كود : Dim Dat as String وبالنسبة للتقسيم ( راجع الدرس السابق ) . تم بحمد الله . سلسلة دروس في إحتراف الوينسوك ( موضوع متجدد ) - abulayth - 20-09-12 مشكور يا استاذ احمد سلسلة دروس في إحتراف الوينسوك ( موضوع متجدد ) - Ahmad Jawad - 20-09-12 abulayth كتب :مشكور يا استاذ احمد تسلم أخي أبو ليث ، مشكوووور عالمرور الطيب سلسلة دروس في إحتراف الوينسوك ( موضوع متجدد ) - Ahmed Abdulla - 28-09-12 ياريت ترفق مثال سيدي الفاضل للتطبيق علي هذه الدروس ولك جزيل الشكر |