معاك يالخضرة ديري حالة
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

الادة winsock والربط بين البرامج والتعامل مع المتصل ما يسمى

2 مشترك

اذهب الى الأسفل

الادة winsock والربط بين البرامج والتعامل مع المتصل ما يسمى Empty الادة winsock والربط بين البرامج والتعامل مع المتصل ما يسمى

مُساهمة  chahara الأحد ديسمبر 23, 2007 6:14 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 بايت
وهذا الخطأ سببه انه عند اخر خمس بايتات مرسلة يجب ان تكو ثلاثة فقط ولكننا نرسل خمسة
الثلاثة +بايتان فارغان وهذة مشكلة بسيطة يمكن حلها عن طريق ارسال حجم الملف فى بداية
الارسال ونسأل اذا كان حجم الملف الاصلى مطروحاً منه الجزء المتكون من حتى الان اكبر من
خمسة ام لا فأن كان لا نضيف الجزء المتبقى فقط .... ويمكن ايضا ارسال اسم الملف فى البداية
على العموم لا تشغلوا بالكم بالاخطأ الان فهذة ابسط طريقة لارسال الملفات ويلزمها كثيرا من التنقيح
chahara
chahara
مدير المنتدي
مدير المنتدي

ذكر عدد الرسائل : 1481
العمر : 34
تاريخ التسجيل : 13/11/2007

http://chahara1989.ahlamontada.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الادة winsock والربط بين البرامج والتعامل مع المتصل ما يسمى Empty رد: الادة winsock والربط بين البرامج والتعامل مع المتصل ما يسمى

مُساهمة  MATRIX HARD الإثنين ديسمبر 24, 2007 7:38 pm

مشكورررررررررررررر
MATRIX HARD
MATRIX HARD
مشرف
مشرف

ذكر عدد الرسائل : 521
العمر : 33
الموقع : في قلب حبيبتي
العمل/الترفيه : في منتدى الاسطورة
المزاج : جيد
تاريخ التسجيل : 26/11/2007

http://iraqalmawadha.ahlamontada.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الرجوع الى أعلى الصفحة

- مواضيع مماثلة

 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى