X-Man ₪ النآ ئبـين ₪
رقم العضوية : 5 عدد المشاركات : 332 العمر : 29 الهواية : المهنة : المزاج : جنسيتي : برنامج التصميم : نقاط الخبرة : 16280 احترام قوانين المنتدى :
| موضوع: الأداة Winsock و الربط بين البرامج الأربعاء مايو 12, 2010 9:32 pm | |
| الادة winsock والربط بين البرامج
الاداة : Microsoft Winsock 6.0
كما تعلمون جميعا تستخدم هذه الاداه للربط بين البرامج ويمكن ان تكون البرامج متصله بشبكة داخلية او حتى على الشبكه العنكبوتية العالميه "internet" او حتى داخل نفس الجهاز اما بالنسبة للشبكة الداخلية فيكفى اسم الجهاز لبدء عملية الربط وبالمثل بالنسبه الى داخل نفس الجهاز اما بالنسبة الى الانترنت فانت تحتاج الى الاى بى "IP" للجهاز الذى تريد الاتصال به لحظة ماذا اذا كان اكثر من برنامج يريد الاتصال بنفس الجهاز كيف سيعرف البرنامج المستقبل اى البرامج يطلبه هو هنا يظهر دور المنفذ "port" والمنفذ هو خط الاتصال الذى يجب ان ينتظر عليه المسقبل ويرسل عليه المرسل وتوفر الاداة 66535 منفذ لذلك لن تحدث عملية "اللخبطة"
** خصائص الادة Winsock
Winsock.LocatPort وهو يحدد رقم المنفذ للبرنامج الحالى Winsock.LocalIP يعطي رقم الاي بي للجهاز Winsock.RemotePort رقم المنفذ للجهاز الذى نريد الاتصال به Winsock.RemoteHost رقم الاي بي للجهاز الذى نريد الاتصال به Winsock. listen تجعل الاداة فى وضع انتظار الاتصال Winsock. connect كما يبدو من الاسم فهى تبدء الاتصال Winsock. accept لقبول طلب الاتصال Winsock. close تغلق الاتصال الحالى Winsock. state تعطى حالة الاداة هل متصلة ام لا او فى حالة الانتظار
winsock.senddata تجعل الاداة ترسل المعلومات winsock.getdata تستقبل وتحفظ اخر المعلومات المرسله winsock.peekdata تستقبل وتحفظ كل المعلومات المرسله منذ بدء الاتصال
**مثال بسيط على كيفية اسخدام الاداة فى هذا المثال سوف نصمم برنامجين احدهما مرسل والاخر مستقبل حيث يقوم المرسل بارسال نوصوص الى المستقبل ويقوم المستقبل بعرضها داخل تكست بوكس
** تصميم المرسل اولا يجب وضع زرين و تكست بوكس والاداة winsock طبعا ولنجعل خاصيه caption للزر الاول هى connect ونضع الكود الاتى للحدث click
Winsock1.Close "Winsock1.RemoteHost = "127.0.0.1 winsock1.RemotePort = 666 winsock1.Connect
فى البداية قمنا باغلاق اى اتصال اخر ثم طلبنا الاتصال بالاى بى 127.0.0.1 وهو الاى بى الافتراضى لاى جهاز وهو غير متصل ثم طلبنا منه الاتصال على المنفذ 666
بالنسبه للزر الاخر فلنجعل له الخاصيه caption هى send ونضع الكود الاتى للحدث click Winsock1.senddata text1.text doevents وهكذا نكون انتهينا من تصميم المرسل ولنبدء بتصميم المستقبل ثم اعطاء البرنامج فرصة لانهاء الاجراءات لكن قبل تصميم المستقبل اود ان انوه على احداث الادة winsock
Winsock_ConnectionRequest يبدء الحدث عندما يحاول برنامج اخر الاتصال بهذا البرنامج
Winsock_Connect يبدء الحدث عندما تتم عملية الاتصال Winsock_Close يبدء الحدث عندما تنتهى عملية الاتصال Winsock_DataArrival يبدء عندما يستقبل البرنامج بيانات Winsock_SendComplete يبدء عند انتهاء ارسال البيانات Winsock_Error يبدء عند حدوث خطأ ما
**تصميم المستقبل
نحتاج فقط الى تكست بوكس و الاداة winsock فى حدث form_load نضع الكود الاتى winsock1.localport = 666 winsock1.listen وقد قمنا هنا بتحديد المنفذ والذى يجب ان يكون نفس المنفذ الذى سيتصل منه المرسل ثم انتظار الاتصال
فى الحدث ConnectionRequest للاداة winsock ضع الكود الاتى winsock1.close winsock1.accept requestID وهنا قمنا باغلاق اى اتصال قديم ثم قبلنا الاتصال الجديد
وفى الحدث DataArrival للاداة winsok Winsock1.getdata news Text1.text = text1.text + news وهنا نقوم باستقبال البيانات ثم وضها داخل المتغير news ولابد ان تكون عرفت news كمتغير حرفى Dim news as string توضع فى قسم التعريفات
نعود الان للحديث عن الجميلة Winsock سنقوم اليوم بعمل خطوة بسيطة الى الامام ولكن هذه الخطوة يلزمها تغير في الافكار لذا سنتخلى فكرة المرسل والمستقبل ولنقول انه "المتصل" و"المنتظر" البعض يحب تسميه العميل والخادم فى الحقيقة الجميع يسمونهما هكذا ولكنى لا احب هذا فتحملوا تسميتى قليلا ولكن بعيدا عن هذا الكلام النظرى الممل وبعيدا عن افكارى الشنيعة فاغلبكم يقول "اخلص عايز تقول ايه" سابدء حتى لا تلعنونى بالنسبة للمرسل الذى كبر واصبح المتصل او العميل client الذى كان بزرين وتكست بوكس ووينسوك سيضاف اليهما تكست بوكس فقط لماذا؟ لعرض الرسائل القادمة من "المنتظر"
بالنسبه للزر connect "اتصل" فسيظل كوده كما هو وكذلك الزر send "ابعث" اذا ما الجديد ؟ الجديد هو ما سيعرضه التكست بوكس الجديد لذا سنضيف كود فى حدث "وصول بيانات" DataArrival وهذا هو الكود Private Sub winsock_DataArrival(ByVal BytesTotal As Long) Dim S As String
wsk.GetData news text2.Text = S End Sub وقد شرحناه فيما قبل فى وقلنا " وهنا نقوم باستقبال البيانات ثم وضها داخل المتغير news ولابد ان تكون عرفت news كمتغير حرفى Dim news as string توضع فى قسم التعريفات"
وهذا كان هو كل التغير فى برنامج المتصل client وهو تغير بسيط
والان نذهب لنطمئن على ابننا الاخر المستقبل اااااه!! كبر هو الاخر واصبح المنتظر server والجديد انه الان يستطيع الكلام .......هذا جميل حقاً كان بونسوك وتكست بوكس سنضيف اليهما تكست اخر وزر ارسال بالنسبة للاكواد الاضافية فهو كود واحد فى الزر الجديد ولنجع له الخاصية caption هى send ولنجعل له الكود التالى Winsock1.senddata text1.text doevents ونحن هنا نقوم بارسال رساله الى المتصل ثم doevents لاعطاء فرصة للبرنامج لارسال البيانات
اما بالنسبة لا كواد تحميل الفورم والحدث طلب اتصال وحدث استقبال بيانات فهى كما هى
وكانت هذه احدى خطواتنا الى الامام ونتبعها بخطوات اخرى ان شاء الله
**خطوة جديده: تفادى الاخطاء والتنسيق العام"...لا لا ليس الخاص بالثانوية ,,"
ذكرنا من قبل الخاصية state ولكن لم نستخدمها هنا كل ما يمكن ان تعطينا هذة الخاصية ملاحظة "هذة الخاصية للقرأة فقط" فنقل مثلا ان كتبنا هذا السطر a=Winsock. state فان القيم التى يمكن ان تأخذها a هى من صفر الى تسعة وهذة الارقام تدل على الاتى
a = 0 مغلق a = 1 مفتوح a = 2 انتظار الاتصال a = 3 الاتصال معلق الان a = 4 الطرف الآخر يعالج البيانات a = 5 الطرف الآخر انهى المعالجة a = 6 جاري الاتصال الان a = 7 متصل a = 8 قام الطرف الآخر بقطع الاتصال a = 9 حصل خطأ ما
اما عن برامجنا السابقة فقد تحدث بها بعض الاخطأ فمثلا *بالنسبة للبرنامج المتصل client فنحن نفترض انه يقوم بالاتصال ثم الارسال ماذا لو ضغط ارسال اولاً!!! بالتأكيد سيحدث خطأ ويغلق البرنامج لذا يجب ان نتأكد اولاً ان البرنامج متصل اى winsock.state=7 اذا كل ما علينا نغير كود الزر ارسال connect الى الاتى If winsock.state=7 then Senddata text1 Else Msgbox("please..connect first") doevents End if وهذا هو الخطأ الذى يمكن ان يحدث فى برنامج المتصل
*بالنسبة للمنتظر server ماذا لو تم الاتصال فعلاً ثم قطع المتصل client الاتصال لاى سبب ما اذا لن يكون المنتظر فى حالة انتظار للاتصال ثانياً ولن يستحق اسمه "منتظر" اذا ومهما حاول المتصل الاتصال لن يتم الاتصال ولن يستحق اسمه هو الاخر بالتبعية لذا اذا خرج المتصل علينا ان نعيد المنتظر الى حالة الانتظار كما كان ولكن كيف سنعرف ان المتصل قطع الاتصال ...لاتقلقوا سنعرف لأن الحدث close سينشط اذا وضح ما علينا فعله لتفادى هذا الخطأ ..هو ان نضع هذا الكود فى الحدث winsock1_close Form1_load كما ترون سطر واحد حل مشكلتنا فعندما يُغلق الاتصال نستدعى حدث تحميل الفورم ليبدء الانتظار من جديد ويمكن وضع نفس السطر فى الحدث Winsock_ error لتفا دى اى خطأ اخر غائب عن اذهاننا هكذا انتهينا من الجزء الخاص بتفادى الاخطأ فماذا عن التنسيق الذى هو ليس تنسيق الثانوية العامة انا هنا اعنى مجرد تنسيق شكل البرنامج فمثلاً ببرنامجنا الحالى اذا ارسل المتصل الرساله الاتبة "اهلا بيك" ثم الرساله "عامل ايه" ستظهر هكذا عند المنتظر "اهلا بيكعاما ايه" لذا وجب علينا ارسال كل رسالة فى سطر منفصل – الا اذا كنت من هواة حل الالغاز والكلمات المتقطعة Winsock.senddata text1+vbnewline
ها نحن نعود بالجديد
*نقل الملفات عبر الشبكة
ها قد عدنا لنكمل حديثناعن الوينسوك حتى اخر شيىء فعلناه كنا فقط نتبادل الرسائل النصية بين البرنامجين ولكن ماذا عن الملفات هل يمكن ان نتبادلها عبر الشبكة؟ ...سؤال غبى منى فكلكم تستعملون المسنجر فى نقل الملفات كان يجب ان يكون السؤال هل يمكن ذلك بواسطة Winsock ؟....نعم يمكن!!! لكن كيف ذلك؟ لنبدء الامور بالتدريج سويا فلنقل مثلا اننا نريد ارسال ملف نصى وليكن اسمه "allnews.txt" اولاً كيف نقرأ الملفات النصيه نفتحه اولا ثم نقرأه سطراً سطرا, ها ارى مصابيح تضيىء فوق رؤسكم مثل افلام الكرتون تقولون ارسل السطر الذى تقرأة الى البرنامج الاخر ثم جمع السطور وكون منها الملف ...رائع انتم حقاً رائعون لنشرع فى كتابة الكود اذاً بالنسة للبرنامج الذى سيقوم بارسال الملف فيحتاج زرين الاول اتصال والثانى ارسال ضع فى زر الارسال هذا الكود كالعادة Winsock1.Close Winsock1.Connect "127.0.0.1", 666 بالطبع تفهمونه ام بالنسبة لزر الارسال فهو كالاتى Open "allnews.txt" For Input As #1 Do While Not EOF(1) Line Input #1, news Winsock1.SendData news DoEvents Loop Close نقوم هنا بفتح الملف "allnews.txt" للقرأة ثم نرسله سطرا سطرا ثم نغلق الملف لاتنسى ان تصنع الملف allnews وتضعه فى نفس مسار البرنامج
اما بالنسبة للبرنامج الذى سيستقبل الملف فلا يحتاج اى شيىء سوى الاداة وينسوك وكالعادة انتظار الاتصال فى حدث تحميل الفورم Winsock1.LocalPort = 666 Winsock1.Listen ثم قبول الاتصال Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long) Winsock1.Close Winsock1.Accept requestID End Sub اما فى حدث وصول بيانات سنقوم باستقبال السطور المرسل وتجميعها فى ملف Open "allnews.txt" For Append As #1 Winsock1.GetData news Print #1, news Close نعم ارسلنا ملفات نصية ولكن ماذا عن باقى انواع الملفات ..لاتقلقوا فانها نفس الفكرة ان الملفات تتكون ايضا من السطور ولكن سطورها من هذة الاشكال "1001010110001000" وهو ما يسمى بالنظم الثنائى ولكن لاتهمنا هذة التعقيدات نحن سنفعل نفس الشيىء نقرأ جزء ثم نرسله وفى الاستقبال نكون هذا الملف
كود برنامج المرسل Dim news as string
Private Sub Command1_Click() Winsock1.Close Winsock1.Connect "127.0.0.1", 666
End Sub
Private Sub Command2_Click() Open "allnews.txt" For Binary As #1 news = Space$(5) Do While Not EOF(1) Get #1, , news Winsock1.SendData news Loop Close End Sub بعد الاتصال قمنا بفتح الملف allnews.txt وحجزنا متغير news وجزنا له خمس بايتات فارغة ثم نقرأ خمس بايتات من الملف ثم نرسلها وهكذا حتى نهاية الملف
كود المستقبل Dim news As String
Private Sub Form_Load() Winsock1.LocalPort = 666 Winsock1.Listen
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long) Winsock1.Close Winsock1.Accept requestID
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Open "allnews.txt" For Binary As #1 Winsock1.GetData news Put #1, , news
End Sub وهنا بعد قبول الاتصال نستقبل الخمس بايتات المرسلة ونضعها فى الملف وهكذا حتى يتكون الملف ولكن هناك خطأ ما فاذا اردنا ارسال ملف حجمة 103 بايت فأن الملف المرسل سيكون 105 بايت وهذا الخطأ سببه انه عند اخر خمس بايتات مرسلة يجب ان تكو ثلاثة فقط ولكننا نرسل خمسة الثلاثة +بايتان فارغان وهذة مشكلة بسيطة يمكن حلها عن طريق ارسال حجم الملف فى بداية الارسال ونسأل اذا كان حجم الملف الاصلى مطروحاً منه الجزء المتكون من حتى الان اكبر من خمسة ام لا فأن كان لا نضيف الجزء المتبقى فقط .... ويمكن ايضا ارسال اسم الملف فى البداية على العموم لا تشغلوا بالكم بالاخطأ الان فهذة ابسط طريقة لارسال الملفات ويلزمها كثيرا من التنقيح أتمنى انه عجبكم الدرس X-Man . | |
|
الزعيم ₪ ادآرة المنتدى ₪
رقم العضوية : 1 عدد المشاركات : 1132 العمر : 29 الهواية : المهنة : المزاج : جنسيتي : برنامج التصميم : نقاط الخبرة : 17728 احترام قوانين المنتدى :
| موضوع: رد: الأداة Winsock و الربط بين البرامج الثلاثاء يونيو 01, 2010 3:34 am | |
| مشكووووووووووووور على الشرح
تحياتي لك
الزعيم | |
|