[سلسلة التعامل مع الويب] - تبادل البيانات بين المستخدمين (تمهيدي) - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم لغة السي شارب C#.NET (http://vb4arb.com/vb/forumdisplay.php?fid=175) +--- قسم : قسم مقالات C#.NET (http://vb4arb.com/vb/forumdisplay.php?fid=177) +--- الموضوع : [سلسلة التعامل مع الويب] - تبادل البيانات بين المستخدمين (تمهيدي) (/showthread.php?tid=10207) |
[سلسلة التعامل مع الويب] - تبادل البيانات بين المستخدمين (تمهيدي) - الشاكي لله - 23-08-13 [COLOR="#0000FF"]بسم الله الرحمن الرحيم
وصل اللهم على محمد وآله الطاهرين السلام عليكم ورحمة الله وبركاته[/COLOR] -- [COLOR="#800000"]اليوم نبدأ ندخل في دروس حلوة ولطيفة وهي دروس حصرية للمنتدى ايضا هذا الدرس يعتبر تمهيد للدرسين القادمين حيث انه في الدرس القادم راح نسوي خدمة ويب للتعامل مع 2 يتسخدمون البرنامج (في اي مكان في العالم) او حتى اكثر من 2 سابقا قلت اني سأشرح الWCF لعمل اتصال مباشر بين جهازين (P2P) ولكن حدثت مشاكل كثيرة مما جعلني اعتمد على الWeb Service كحل آمن وبديل ، والسطور القادمة إن شاء الله سأشرح لماذا فعلت ذلك[/COLOR] -- [COLOR="#FF0000"] الكثير من المقدمون على تعلم الشبكات ونظم التوزيع يعانون ويسآلون من كيفية الاتصال بجهاز اخر عبر الPublic IP مباشرة وهي مايسمى بمدأ Peer to peer . العتب ليس على الذي يريد التعلم وإنما العتب على مؤليفي الكتب الذين لم يوضحوا هذا الشيئ فأكثر الشروحات والامثلة حول الشبكات هي كلها تطبق على الشبكة المحلية (LAN) اي المتصلين معك بنفس الروتر ،ف 98% من الامثلة الموجودة على النت تتحدث ذلك . بحثت كثيرا لاسابيع ، وجدت بعض التوضيحات والمشاكل التي تحدث عندما تريد الاتصال بشخص خارج روترك عبر ادخال الايبي العالمي (Public)[/COLOR] -- [COLOR="#2F4F4F"]طريقة الاتصال بالايبي العالمي سهلة وغير مختلفة من الطريقة العادية المعروفة لكل من تعلم الشبكات فلو قررنا استخدام بروتوكول TCP للإتصال بشخص على الانترنت يكفي ان تقوم بهذا [/COLOR] برنامج العميل : PHP كود : public void Connect(string ip, int port) علما بأن المثال فوق لأيبي عالمي وبرنامج السيرفر : PHP كود : public void StartListening(object port) يكفي ان يقوم السيرفر بالنصت على بورت معين حتى يستقبل اتصال من العميل حتى لو كان العميل على شبكة اخرى -- [COLOR="#008080"]بتقولي انا جربت الي تقول عنه آلاف المرات ولكن لايمكنني الاتصال مع اي شخص خارج شبكتي فلماذا حصل ذلك ؟؟[/COLOR] -- [COLOR="#FF0000"]عندما تريد الاتصال بشخص خلف الروتر (يعني جهاز موصل بروتر في شبكة غير) لابد لك ان تحدد ايبي جهازه العالمي ، ولكن تقنية NAT اللعينة تعطي جميع الاجهزة التي خلف الروتر آيبي عالمي واحد!![/COLOR] -- [COLOR="#006400"]تقنية الNat الـNAT يستخدم لمشاركة Public IP واحد على مجموعة من الأجهزة الموجودة خلف هذا الـRouter ويملك كل منها Private IP بمعنى انه لو كان لديك 50 جهاز تتصل بالإنترنت من خلال الـRouter فالـ50 جهاز يتشاركون في Public IP وحيد أي ان Packet المرسل من جميع اأجهزة والتي ستخرج من الـ Router ستحتوي في جزء الـSource IP على عنوان واحد وهو الـPublic IP إذا السؤال هنا كيف يميز الـRouter عند استقبال الـResponse ان هذا الـPacket لذلك الجهاز . الحل الوحيد هنا هو استخدام الطبقة الأخرى لتميز وهي الـTransport والتي تحتوي في مكوناتها على Port المصدر وهذا البورت سيكون في الأغلب Dynamic بمعنى ان توليده سيكون من قبل نظام التشغيل عند الإرسال وسيتغير عند مروره من الراوتر ويضع الراوتر جدول يبين كل Port مستخدم بما يقابلها من عنوان ومن هنا يميز الراوتر عند استقبال الـPacket ان هذه البيانات لذلك الجهاز من خلال فحص الـPort Number , اردت ان اقول كل ذلك لأوضح نقطة هامة وهي (لا يمكن ان يمرر الـRouter بيانات إلى جهاز موجود خلفه إلا في حالة انك قمت بإرسال الطلب اولا بحيث يعرف الـRouter في جدول الـNAT على عنوان جهازك والبورت الذي تستخدمه للستقبال) وهذا يعني ان جميع تلك البرامج لا يمكن ان تتصل مع بعضها بشكل Peer-to-Peer بدون وجود Service ترسل الطلب اليها بمعنى ان المرسل لا يمكنه ان يرسل رسالة إلى الجهاز الآخر بدون ان يتم إضافة الـPort والـIP في الـNAT Table والتي تتم بصورة اوتوماتيكية عند قيام الجهاز الآخر أي المستقبل بالإتصال مع الـService اولا.[/COLOR] -- بما ان الكل يتشاركون بآيبي عالمي واحد فكيف تحدد من تريد إرسال البيانات له ! الحل .. يتبع .... -- [COLOR="#4B0082"]حتى لو كان لكل جهاز خلف الروتر آيبي عالمي محدد فالاتصال سيكون صعبا ايضا لوجود الجدران النارية [COLOR="#FF0000"]فالروتر له جدار ناري خاص والوندوز له جدار ناري ايضا ومكافح الفيروسات له جدار ناري لعين ايضا[/COLOR] فهاؤلاء سيمنعون الاتصال باخادمك على جهاز اخر حتى لو كان الايبي العالمي هو لشخص واحد ولايشترك معاه احد . فالحل هو فتح بورت في الروتر (port forwarding) وتضع فيه البورت الذي تريد فتحه بجانب ايبي الجهاز المحلي الذي تريد منه ان يستقبل او يرسل البيانات على هذا البورت فالقيام بهذا الحل يقوم بتخطي مشكلة الNAT وتوزيعها الايبي الموحد لكل الاجهزة فالان عند تلقي اي بيانات من شبكة خارجية على البورت 455 يقوم الروتر مباشر بإرسال البيانات لجهازك لاننا وضعنا الIp جهازنا (المحلي) في الاعدادات والايبي المحلي لايمكن ان يشترك فيه جهازين على نفس الشبكة لنقول للروتر : اذا استقبلت اي بيانات على بورت 455 قم بإرسالها الى ايبي جهازنا على الشبكة المحلية وهو في مثالنا 192.168.15.9 فأي packet او بيانات قادمة من الخارج (على البورت 455) سيتم إرساله فقط للأيبي المحلي المحدد فهكذا تجاوزنا تقنية NAT المزعجة[/COLOR] -- [COLOR="#B22222"]ولكن هذه الطريقة صعبة على المستخدم فهل ستقول لكل مستخدم ان يفتح بورت في جهازه ؟؟؟ََ ربما لايعرف معلومات دخول الروتر (يوزر وباسوورد) وايضا القيام بذلك ليس عمليا من الاساس لو كانت هناك طريقة لفتح بورت لجميع الرواتر لأمكننا فتح بورت في جهاز المستخدم من خلال كود في برنامجنا وبالتالي يمكن الاتصال P2P معه ولكن للأسف لاتوجد طريقة لفتح بورت لجميع الرواتر إذن مالحل ...؟؟[/COLOR] -- [COLOR="#006400"]بعد بحثي المطول في جميع المنتديات العربية والاجنبية استنتجت 4 حلول لنستطيع التواصل مع برنامجنا في الطرف الاخر - [COLOR="#FF0000"]1- فتح بورت في روتر يستعمل تقنية UpNp 2- عمل شبكة افتراضية VPN بين المستخدمين 3- استخدام سيرفر وسيط[/COLOR] 4-NAT Traverse (سيوضح في مقالة اخرى) - سنعود بعد قليل ... [/COLOR] -- عدنا .. 1- فتح بورت في روتر يستعمل تقنية UpNp بعض الرواتر تدعم هذه التقنية تقوم بفتح بورت في الوتر وتوجد فئة خاصة تتعامل مع UpNp : PHP كود : using Microsoft.VisualBasic; مايهمنا في هذه الفئة هي الدالة ForwardPort التي تقوم بفتح بورت في الروتر ولكن رغم ذلك لايتعبر الحل الامثل فابعض الروترات لاتدعم UPnP وإنما الحديثة فقط تدعم ذلك[/COLOR] -- [COLOR="#FF0000"] 2- استخدام شبكة افتراضية VPN[/COLOR] [COLOR="#800080"] VPN باعتبارها آمنة (يعني مايقدر يتحجج عليك الانتي فايروس) وباعتبارها شبكة بين مستخدمين برنامجك . إذن يمكنك نقل البيانات واستخدامها بسهولة بين أعضاء شبكتك . حيث سيكون لكل واحد فيهم ايبي خاص تستطيع إرسال البيانات إليه ولكن الحصول على حساب VPN server ليس سهلا فعليك الاشتراك بمواقع تقدم هذه الخدمة للحصول على vpn جديد ومحترم وفي وندوز 7 هناك خاصية تخلي جهازك VPN server ولكن يجب ان يكون جهازك شغال 24 ساعة عشان الشبكة ماتنقطع هههههههه لأنه سيكون head of network[/COLOR] -- 3- استخدام سيرفر وسيط [COLOR="#800080"]وهو الحل الذي افضله واغلب البرامج حاليا تستعمله فلا حاجة لمعرفة الايبي للجهاز الذي تريد التواصل معه ولن يقوم الروتر بمنع الاتصال (لأنك ستتصل عبر بورت 80 وهو البورت الوحيد الذي لايمنعه الروتر - حسب معلوماتي) المهم من المستحيل ان يمنع الروتر الاتصال لأنك الروتر سيتصل ليس مباشرة بجاهزك !! بل سيتصل بموقع يكون هو وسيط بينك وبينه[/COLOR] شاهد الصورة : [COLOR="#2F4F4F"]مثلا عنما تريد ارسال رسالة لجهاز اخر (سيرفر) سيقوم جهازك مثل (العميل) بالاتصال بالوسيط وإرسال نص الرسالة له فيقوم الوسيط بإعادة ارسال الرسالة الى السيرفر يتلقى السيرفر الرسالة ويعرضها للمستخدم[/COLOR] بسيط صح !! [COLOR="#FF0000"]هذا الوسيط هو عبارة عن web service نصممها ونرفعها على استضافة يمكننا تطوير الوسيط لجعله يتصل بقاعدة بيانات فممكن للعميل ان يرسل نصا للوسيط قيقوم الوسيط بحفظ النص في قاعدة البيانات ويقوم السيرفر على الطرف الاخر بالاتصال بالوسيط مرة اخرى والاستعلام عن النص [/COLOR] -- [COLOR="#006400"]تقنية الWeb service جمييلة للغاية وهي احدى تقنيات مايكروسوفت المتوفرة عن Visual studio او Visual web developer تقدر تعتبر الweb service كبرنامج على الويب فمثلا يمكننا وضع دالة تقوم بجمع رقمين في الweb service ويقوم برنامجنا على سطح المكتب بإستعامل الدالة للحصول على الناتج أو حتى لصفحة asp.net يمكنها فعل ذلك[/COLOR] [COLOR="#800080"]فمثلا بإضافة web service قمنا بتصميها نذهب لبرنامجنا ونقوم بإضافة web service refrance[/COLOR] ستظهر لنا هذه النافذة نقوم بوضع رابط الخدمة [COLOR="#0000CD"]ممكن ان يكون على localhost او على استضافة عشان تجرب الخدمة قم بتوصل البرنامج بها عبر localhost [COLOR="#FF0000"]ثم اذا خلصت البرنامج وقررت تنشره للمستخديم قم برفع الخدمة على استضافة تدعم asp وقم باستبدال رابط الlocalHost برابط الخدمة على الويب عشان يستطيع المستخدمون الوصول لها[/COLOR][/COLOR] [COLOR="#B22222"]هذي الدوال الى قمت بكتابتها في ويب سيرفس يمكنني اسدعائها وتنفيذها بسهووووولة كأنك تتعامل مع ملف dll عادي[/COLOR] -- [COLOR="#B22222"]لن اقول المزيد حول هذه التقنية الرائعة بل قد خصصت لها مقالة كاملة ساضعها فيما بعد إلي ماشاف حلقات السلسلة السابقة : [سلسلة التعامل مع الويب] - ارسال الطلبات HttpWebRequset [سلسلة التعامل مع الويب] تحليل الصفحات باستخدام HtmlAgilityPack تحياتي لكم "الشاكي لله" [/COLOR] [سلسلة التعامل مع الويب] - تبادل البيانات بين المستخدمين (تمهيدي) - الشاكي لله - 23-08-13 كتب ومراجع لتعلم برمجة الشبكات
كتاب بروتوكولات الشبكات tcp,udp,ip وبناء التطبيقات بالبروتوكول -- أحترف برمجة الشبكات والنظم الموزعة [سلسلة التعامل مع الويب] - تبادل البيانات بين المستخدمين (تمهيدي) - الشاكي لله - 23-08-13 إنتهى بحمد الله
[سلسلة التعامل مع الويب] - تبادل البيانات بين المستخدمين (تمهيدي) - MSDOS - 23-08-13 مجهود رائع، بارك الله فيك [سلسلة التعامل مع الويب] - تبادل البيانات بين المستخدمين (تمهيدي) - Sajad - 23-08-13 السلام عليكم ورحمة الله وبركاته معلومات رائعة جزاك الله كل الخير اخي العزيز ووفقك لما يحبه ويرضاه لك بانتظار الدروس الباقية [سلسلة التعامل مع الويب] - تبادل البيانات بين المستخدمين (تمهيدي) - مبرمج أوتار - 23-08-13 بارك الله فيك معلومات رائعه راح استفيد منها كثير جعلها الله في موازين حسناتك في انتظر ابداعاتك القادمة لك مني اجمل تحية [سلسلة التعامل مع الويب] - تبادل البيانات بين المستخدمين (تمهيدي) - الشاكي لله - 23-08-13 MSDOS كتب :مجهود رائع، بارك الله فيك الحمدلله اخي اتمنى انك استفدت مني مبرمج أوتار كتب :بارك الله فيك معلومات رائعه إن شاء الله تستفيد sajad كتب :السلام عليكم ورحمة الله وبركاته اهلا بك استاذي sajad لاشيئ يغلى عليكم يأهل هذا المنتدى الطيبين وايضا لقد استفدت من مقالتك الرائعة لتطبيق فكرتي Moving Complex Objects Across The Net Using Serlialization تحياتي لكم جميعا |