اهلا بك يا زائر منور المنتدى مشاركاتك هي 0 يلا شدلنا حيلك وشارك كمان
 
الرئيسيةبوابة المبدعينس .و .جالمجموعاتالتسجيلالتسجيلدخول

شاطر | 
 

 الأداة Winsock و الربط بين البرامج

اذهب الى الأسفل 
كاتب الموضوعرسالة
X-Man
₪ النآ ئبـين ₪
₪ النآ ئبـين ₪
avatar


رقم العضوية : 5
عدد المشاركات : 332
العمر : 24
الهواية الهواية :
المهنة :
المزاج المزاج :
جنسيتي جنسيتي : Saudi Arabia
برنامج التصميم :
نقاط الخبرة : 10346
احترام قوانين المنتدى : 100%



مُساهمةموضوع: الأداة 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







.


الرجوع الى أعلى الصفحة اذهب الى الأسفل
http://WWW.GRAPHICS.MAM9.COM
الزعيم
₪ ادآرة المنتدى ₪
₪ ادآرة المنتدى ₪
avatar


رقم العضوية : 1
عدد المشاركات : 1132
العمر : 23
الهواية الهواية :
المهنة :
المزاج المزاج :
جنسيتي جنسيتي : Syria
برنامج التصميم :
نقاط الخبرة : 11794
احترام قوانين المنتدى : 100%



مُساهمةموضوع: رد: الأداة Winsock و الربط بين البرامج   الثلاثاء يونيو 01, 2010 3:34 am

مشكووووووووووووور على الشرح

تحياتي لك

الزعيم










الرجوع الى أعلى الصفحة اذهب الى الأسفل
http://abomhamad.deviantart.com/ https://www.facebook.com/home.php?ref=home http://graphics.mam9.com
 
الأداة Winsock و الربط بين البرامج
الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
 :: || ـالأقســام ـالتقنــيهـ ~ :: All For Programming-
انتقل الى:  




 

ملتقى الابداع والمبدعين



Designed And Developing By graphics.mam9.com
Supporting : firefox, IE 7, IE 8, GC 1, AB 11.7
Vida Style [Ver 1.0] With css