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