اشاره :
يكي از نياز هاي برنامه نويسان در نوشتن برنامه هاي حرفه اي و چند كاربره ، انتقال داده ها بين دو يا چند كامپيوتر كه از طريق LAN و يا از طريق WAN( اينترنت ) با هم در ارتباط هستند مي باشد.چنين امكاني از ابتدايي ترين زبان ها برنامه نويسي تا كنون به اشكال مختلف در اختيار برنامه نويسان قرار گرفته است و سير سهولت در ايجاد ارتباط در بين كامپيوتر ها روز به روز افزايش يافته است بطوريكه اكنون يك برنامه نويس متوسط نيز مي تواند چنين برنامه هايي را بنويسد. برنامه هايي چون ويديو كنفرانس ، بازي هاي تحت شبكه و چت نمونه هايي از اينگونه برنامه ها مي باشد. در اين مقاله سعي شده است اصول ابتدايي اينگونه برنامه ها تشريح شود. پيش نياز استفاده از مطالب اين مقاله آشنايي متوسط به زبان VB.NET و برخي مفاهيم كلي شبكه مي باشد.كاربران زبان C# نيز مي توانند از كليه مطالب اين مقاله استفاده كنند.



روند ارائه اين مقاله بدين شكل خواهد بود:

• انواع مدل هاي شبكه اي، براي برنامه نويسي تحت شبكه
• ابزار هاي .Net براي برنامه نويسي تحت شبكه
• يك برنامه ارسال و دريافت پيام تحت شبكه محلي

پس از اتمام اين مقاله شما توانايي هاي زير را خواهيد داشت :

• آشنايي با برخي از انواع استراتژي هاي موجود براي برنامه نويسي تحت شبكه
• آشنايي با برخي از Class ها و توابع مورد نياز براي برقراري ارتباط بين كامپيوتر ها
• توان ارتباط بين دو كامپيوتر و رد وبدل داده بين آن دو

انواع مدل هاي شبكه اي، براي برنامه نويسي تحت شبكه
منظور از انواع مدل هاي برنامه نويسي تحت شبكه اين است كه چگونه كامپيوتر‌هاي موجود در يك شبكه را در برنامه خود شناسايي كنيم و با آنها ارتباط برقرار كنيم.
در ذيل سه مدل از انواع مشهور آن تشريح شده است:

1ـ سرور(Server) ثابت مركزي و انتقال داده بين كلاينت ها (Clients) از طريق سرور مركزي
همانطور در شكل 1 نشان داده شده است در اين مدل هيچ يك از كامپيوتر‌ها با هم مستقيما در ارتباط نيستند و به همين دليل نيازي به شناسايي ديگر كامپيوتر‌ها در شبكه ندارند. انتقال داده بين كامپيوتر‌ها از طريق سرور مركزي شناخته شده در شبكه انجام مي‌گيرد .هر كامپيوتري به محض ورود به شبكه خود را به سرور مركزي معرفي مي‌كند و ليست ساير كامپيوتر ها را از سرور مركزي دريافت مي‌كند و چنانچه بخواهد داده اي را به ديگر كامپيوتر ها ارسال كند آن را به سرور تحويل داده و وظيفه نهايي تحويل داده به كامپيوتر مقصد به عهده سرور مركزي مي‌باشد و چنانچه داده اي از طرف ساير كامپيوتر ها در شبكه برايش ارسال گردد مي تواند آن را از سرور در خواست كند.


شكل 1



برخي از مزاياي اين مدل:

• نياز به الگوريتمي براي شناسايي ديگر كامپيوتر‌ها نداريم.

• به دليل وجود سرور مركزي قابليت ثبت و پيگيري كليه داده هاي ارسالي بين كامپيوتر ها را دارا مي‌باشد.

• قابليت ذخيره و بعد ارسال، براي اطمينان از دريافت داده توسط كامپيوتر مورد نظر را دارا مي‌باشد.

• تعداد خطوط ارتباطي بين كامپيوتر ها به حداقل مي‌رسد.

برخي از معايب اين مدل:

• در صورت از كار افتادن سرور مركزي در حين عمليات ، كليه ارتباطات و داده ها از دست مي‌رود و عملا شبكه ارتباطي از بين خواهد رفت.

• بار كاري سرور مركزي بسيار بالا بوده و به همين دليل در شرايط يكسان سرعت انتقال داده ها كند تر از ساير روش ها خواهد بود

2ـ سرور شناسايي مركزي و انتقال داده بين كلاينت ها به صورت مستقيم
در اين مدل هر كامپيوتر پس از ورود به درون شبكه ابتدا ورود خود را به سرور اعلام كرده سپس ليست كامپيوتر هاي متصل به شبكه به همراه IP آنها را از سرور دريافت مي‌كند و پس از اين جزء براي Update كردن ليست كامپيوتر هاي موجود در شبكه كاري باسرور ندارند و انتقال داده را مستقيما با كامپيوتر دلخواه انجام مي‌دهند.به شكل 2 توجه كنيد.



شكل 2



برخي از مزاياي اين مدل:

• به دليل اينكه انتقال داده ها بين كامپيوتر ها دو به دو انجام مي‌شود بار كاري چنداني را سرور متحمل نمي‌شود.

• در صورت از كارافتدان سرور كامپيوتر هاي فعلي موجود در شبكه مي‌توانند به كارشان ادامه دهند.

• انتقال داده ها سريع مي‌باشد.

• نياز به جستجو براي كامپيوتر‌هاي موجود در شبكه ندارند.

برخي از معايب اين مدل:

• در صورت از كار افتادن سرور ، كامپيوتر ديگري قابليت اتصال به شبكه را ندارد.

• تعداد خطوط ارتباطي نسبت به مدل 1 بيشتر است.

• قابليت ذخيره كل داده هاي رد و بدل شده و پيگيري آنها وجود ندارد.

3ـ شناسايي مكاشفه اي (Heuristic ) ساير كامپيوتر ها و انتقال داده بين كامپيوتر ها به صورت مستقيم
در اين مدل هر كامپيوتري وظيفه شناختن ساير كامپيوتر‌هاي موجود در شبكه و بروز رساني ليست آنها را شخصا به عهده دارد و انتقال داده ها به صورت مستقيم بين كامپيوتر ها انجام مي‌گيرد. به شكل 3 توجه كنيد.



شكل 3


برخي از مزاياي اين مدل :

• نيازي به وجود سرور مركزي نيست.

• در صورت از كار افتادن هر يك از كامپيوتر‌ها ، هيچ خللي در كار سيستم به وجود نمي آيد.

• انتقال اطلاعات سريع است.

برخي معايب اين مدل:

• الگوريتم هاي پيچيده براي به دست آوري و بروز رساني ليست آدرس هاي كامپيوتر‌هاي موجود در شبكه.

• تعداد خطوط ارتباطي بيشتر نسبت به روش اول.

• قابليت ذخيره كل داده هاي رد و بدل شده و پيگيري آنها وجود ندارد.

برخي بهينه سازي براي مدل هاي سه گانه فوق :
با استفاده از تركيب مدل هاي فوق يا انجام تغيير كوچك در مدل هاي فوق مي‌توان مدل‌هاي كارآمد تر و امن‌تري را ايجاد كرد كه در ذيل دو مدل تركيبي و تغييري آنها وجود دارد:

• تركيب مدل 1 و 2:
در اين مدل تركيبي ، مزاياي روش دوم را داريم و در صورت نياز مي توانيم اطلاعات را بر روي يك سرور مركزي ذخيره كنيم و از مزاياي روش اول نيز استفاده كنيم(به شكل 4 توجه كنيد) .



شكل 4


• تغيير در مدل 2 :
در اين مدل تغييريافته، در صورت از كار افتدان سرور اصلي، كامپيوترها مي‌توانند از طريق سرور پشتيبان يكديگر را شناسايي كنند. و از تمامي مزاياي روش 2 نيز استفاده كنند (به شكل 5 توجه كنيد).




شكل 5

در نهايت نمي‌توان براي كليه استفاده ها و شرايط ، يك مدل را به عنوان مدل بهينه انتخاب كرد بلكه در شرايط و استفاده هاي مختلف مدل انتخابي قابل تغيير مي‌باشد و مي‌توان بسته به نياز از تركيب و يا تغيير در مدل هاي پايه،مدل بهينه را انتخاب كرد.

ابزار هاي .Net براي برنامه نويسي تحت شبكه

1ـ TCP Listener
همان طور كه از اسم آن مشخص است يك Object است كه از آن براي ساخت يك Listener (شنونده) بر روي يك پورت خاص استفاده كرده و از طريق آن با كامپيوترهايي كه روي آن پورت خاص به كامپيوتر وصل مي‌شوند رد و بدل اطلاعات كنيم.
برخي از خواص و متد هاي رايج آن عبارتند از :

متد AcceptSocket : با فراخواني اين متد ، TCP Listener منتظر اتصال يك كلاينت به كامپيوتر مي‌شود پس از اتصال يك كلاينت يك آبجكت از نوع Socket برمي‌گرداند كه از آن مي‌توانيم جهت خواندن و ارسال داده از وبه كلاينت وصل شده استفاده كنيم.

متد AcceptTCPClient: با فراخواني اين متد ، TCP Listener منتظر اتصال يك كلاينت به كامپيوتر مي‌شود پس از اتصال يك كلاينت يك آبجكت از نوع TCPClient برمي‌گرداند كه از آن مي‌توانيم جهت خواندن و ارسال داده از وبه كلاينت وصل شده استفاده كنيم.

متد Start : با فراخواني اين متد ، TCP Listener شروع به گوش دادن به پورت داده شده به آن مي كند و اين متد را بايد قبل از شروع استفاده از اين آبجكت فراخواني كرد.

متد Stop : با فراخواني اين متد ، TCP Listener از گوش دادن به پورت داده شده به آن متوقف مي‌شود و اين متد را بايد پس از خاتمه استفاده از اين آبجكت فراخواني كرد.

خصوصيت Active : مشخص مي‌كند كه آيا آبجكت TCPListener شروع به گوش دادن به پورت داده شده به آن كرده است يا خير؛ كه به طور معمول با فراخواني متد Start اين خصوصيت مقدار True را برمي‌گرداند و با فراخواني متد Stop مقدار False را برمي‌گرداند .

2ـ TCP Client
از اين آبجكت براي اتصال به يك سرور از طريق يك پورت خاص استفاده مي‌كنيم و بوسيله آن مي‌توانيم از سرور داده بخوانيم يا به آن داده ارسال كنيم.برخي از خواص و متد هاي رايج آن عبارتند از:

خصوصيت ReceiveTimeout : حداكثر مدت زماني كه آبجكت بايد براي دريافت داده از سرور منتطر بماند را مشخص مي كند. برحسب ميلي ثانيه.

خصوصيت SendTimeout : حداكثر مدت زماني كه آبجكت بايد براي ارسال داده به سرور منتطر بماند را مشخص مي‌كند. برحسب ميلي ثانيه

متد Connect : ارتباط آبجكت را با سرور مورد نظر را كه با يك IPو پورت مشخص مي‌شود ، برقرار مي كند.

متد Close : ارتباط آبجكت را با سروري كه هماكنون به آن متصل است قطع مي‌كند.

متد GetStream : با فراخواني اين متد يك Stream از نوع NetworkStream به دست خواهيم آورد كه از آن مي توانيم براي ارسال و دريافت داده با سرور استفاده كنيم.

خصوصيت Active : مشخص مي‌كند كه آيا ارتباط آبجكت با سرور برقرار است يا خير؛ در صورت برقراري ارتباط مقدار True و در غير اين صورت مقدار False را برمي‌گرداند.

3ـ Socket
يك ارتباط يا در واقع يك كانال ارتباطي براي اتصال دو كامپيوتر است و در برنامه نويسي تحت شبكه به وفور مورد استفاده قرار مي‌گيرد. برخي از خواص و متدهاي رايج آن عبارتند از:

متد Connect : ارتباط آبجكت را با آدرس داده شده به آن برقرار مي‌كند.

متد Close : ارتباط آبجكت را با اتصال فعال فعلي (Active Connection) قطع مي‌كند.

متد Send : به وسيله اين متد مي توان يكسري داده را به اتصال فعال فعلي ارسال كرد.

متد Receive : به وسيله اين متد مي‌توان داده هاي موجود در اتصال فعال فعلي را دريافت كرد.

متد Shutdown : كليه ارسال و دريافت هاي جاري را متوقف كرده و ارتباط آبجكت را با اتصال فعال فعلي قطع مي‌كند.

خصوصيت Connected : مشخص مي كند كه آيا آبجكت، ارتباطي با كامپيوتر خارجي برقرار كرده است يا خير.

خصوصيت Available : مقدار داده قابل خواندن در آبجكت را بر حسب بايت برمي‌گرداند.

نكته : درباره Socket ، متد ها و خصوصيت هاي فراوان ديگري نيز وجود دارد كه از حوصله اين بحث خارج است و تنها به گفتن اين جملات اكتفا مي‌كنم كه Socket پايه آبجكت هاي TCPClient و TCPListener مي‌باشد . يعني از آن مي‌توان هم براي ساخت يك سرور استفاده كرد و هم براي متصل شدن به يك سرور. و قابليت ارسال داده ، دريافت داده و برقراري ارتباط به دو شكل همزمان ( Synchronous ) و غير همزمان (Asynchronous) را دارا مي‌باشد.

4ـ Network Stream
يك كانال داده اي است كه از آن براي نوشتن و خواندن داده، در ارتباط شبكه اي استفاده مي شود. برخي از خواص و متد هاي رايج آن عبارتند از:

خصوصيت CanRead : مشخص مي كند كه آيا مي توان از آبجكت ، داده اي خواند يا خير.

خصوصيت CanWrite : مشخص مي كند كه آيا مي توان از طريق آبجكت، داده اي را به شبكه ارسال كرد يا خير.

خصوصيت DataAvailble : مشخص مي كند كه آيا داده اي براي خواندن وجود دارد يا خير.

متد Read : داده هاي موجود در آبجكت را مي خواند.

متد Write : يكسري داده را از طريق آبجكت به شبكه ارسال مي كند.

متد Close : كانال داده اي آبجكت را قطع مي كند.

نوشتن يك برنامه ارسال و دريافت پيام تحت شبكه محلي
اكنون كه تاحدودي با برخي از ابزار .NET براي برنامه نويسي تحت شبكه آشنا شديد. مي خواهيم يك مثال بسيار ساده كه در برگيرنده مطالب گفته شده بالا مي باشد را بنوسيم . اين مثال در واقع شامل دو برنامه ساده است يكي برنامه سرور و يكي برنامه كلاينت.
بدين شرح كه پس از شروع به كار برنامه سرور ، يك يا چند نسخه از برنامه كلاينت به برنامه سرور وصل گرديده و به سرور بتوانند پيامي بفرستند و سرور پس از گرفتن پيام از كلاينت پيغام مبني بر دريافت پيغام به كلاينت ارسال كند.

اكنون شروع به نوشتن قدم به قدم برنامه ها مي‌كنيم:

برنامه سرور:

1ـ ويژوال استوديو 2003 را اجرا كنيد.

2ـ يك پروژه Windows Application به زبان VB.NET به نام MyServer ايجاد كنيد.

3ـ عنوان فرم اصلي را Simple Server قرار دهيد.

4ـ كنترل هاي مورد نظر را مطابق جدول 1 به فرم اضافه كرده و خصوصيات گفته شده را به كنترل ها نسبت دهيد.




جدول 1



5ـ كنترل هاي اضافه شده به فرم را مانند شكل 6 روي فرم مرتب كنيد.




شكل 6



6ـ به قسمت كد فرمتان برويد Namespace هاي System.net ،System.net.sockets ،System.Threading و System.Text را Import كنيد.

7ـ كد 1 را اضافه كنيد.



كد 1

8ـ براي رويداد OnClick دكمه BtnStart ، كد 2 را وارد كنيد.



كد 2


9ـ براي رويداد OnClick دكمه BtnStop ، كد 3 را وارد كنيد.



كد 3


برنامه سرور تكميل شد!! پروژه را ذخيره كنيد .

برنامه كلاينت:

1ـ يك پروژه Windows Application به زبان VB.NET به نام MyClient به Solution اضافه كنيد.

2ـ عنوان فرم اصلي را Simple Client قرار دهيد.




جدول 2



3ـ كنترل هاي مورد نظر را مطابق جدول 2 به فرم اضافه كرده و خصوصيات گفته شده را به كنترل ها نسبت دهيد.

4ـ كنترل هاي اضافه شده به فرم را مانند شكل 7، روي فرم مرتب كنيد.




شكل 7



5ـ به قسمت كد فرمتان برويد Namespace هاي System.net ، System.net.sockets ، System.Threading و System.Text را Import كنيد.

6ـ براي رويداد OnClick دكمه BtnSend ، كد 4 را وارد كنيد.



كد 4


برنامه كلاينت تكميل شد!! پروژه را ذخيره كنيد .

اكنون كل Solution را يك بار Build كنيد و سپس :

• روي پروژه MyServer كليك راست كرده از منوي زمينه، Debug و از آنجا Start New Instance را انتخاب كنيد.

• پس از اجراي پروژه MyServer درون فيلد Server Port عدد 3000 را وارد كنيد.

• روي دكمه Start Server كليك كنيد.

• در همان حال كه پروژه MyServer در حال اجرا است به محيط Visual Studio برگرديد.

• روي پروژه MyClient كليك راست كرده از منوي زمينه Debug و از آنجا Start New Instance را انتخاب كنيد.

• مرحله قبل را يك بار ديگر انجام دهيد.

• اكنون مي بايست دو نسخه از MyClient و يك نسخه از MyServer در حال اجرا باشد.

• به پنجره كلاينت اول برويد و درون Server Port عدد 3000 را وارد كنيد.

• درون فيلد Your Message متن "This Is Client A" را وارد كنيد و روي دكمه Send Message كليك كنيد تا پيام به سرور ارسال شود. در صورت موفقيت بايستي پيغام
" Your Message Received!!!" را از سرور دريافت شود و در فيلد Messages نمايش داده شود.

• به پنجره كلاينت دوم برويد و درون Server Port عدد 3000 را وارد كنيد.

• درون فيلد Your Message متن "This Is Client B" را وارد كنيد و روي دكمه Send Message كليك كنيد تا پيام به سرور ارسال شود. در صورت موفقيت بايستي پيغام
" Your Message Received!!!" را از سرور دريافت شود و در فيلد Messages نمايش داده شود.

• پس از اين كار به پنجره سرور برويد بايد در فيلد Messages دو پيغام
"This Is Client A" و "This Is Client B" نمايش داده شده باشد.

• روي دكمه Stop Server كليك كنيد تا سرور متوقف شود.

• از برنامه خارج شويد.

• نمونه اجراي فوق، در شكل 8 نمايش داده شده است.




شكل 8


اكنون مثال ساده ما انجام و آزمايش گرديد. به چند نكته دقت كنيد:

1ـ در مثال فوق به فرض اينكه شما مي‌خواهيد برنامه سرور و كلاينت را روي يك كامپيوتر اجرا كنيد ؛ در برنامه كلاينت، آدرس سرور را IP كامپيوتر فعلي در نظر گرفته‌ام اگر مي‌خوهيد اين برنامه را روي دو كامپيوتر جدا گانه اجرا كنيد در بر نامه كلاينت به جاي كد
(cl.Connect (MyIP.ToString, SPort
از كد
cl.Connect("آدرس سرور مورد نظر", SPort)
استفاده كنيد.

2ـ اين برنامه را مي توانيد بروي ده ها كامپيوتر همزمان اجرا كنيد.

در پايان بايد اين نكته را گوشزد كنم كه مثال ارائه شده صرفا جهت يادگيري و براي آشنايي مقدماتي شما با برنامه نويسي تحت شبكه مي‌باشد و از هيچ يك از مدل‌هاي كاربردي گفته شده در قسمت اول پيروي نمي كند ؛ بلكه فهم اين مثال بسيار ساده يك زمينه خوب براي شما ايجاد مي‌كند تا با اندكي تحقيق در مورد چنين برنامه هايي بتوانيد انواع مدل هاي برنامه نويسي تحت شبكه را با سهولت پياده سازي كنيد.