سوکت پروگرمینگ در سی شارپ
تا کنون مطالب زیادی در باره ی سوکت پروگرمینگ با زبان پایتون دیده ایم. اما نباید از یاد برد که برنامه نویسی شبکه تنها با پایتون امکان پذیر نیست. در این مقاله قصد داریم با کمک زبان سی شارپ یک پروژه برنامه نویسی سوکت را انجام دهیم. بدیهی است که برای برنامه نویسی شبکه باید با مفاهیم اولیه شبکه, آشنایی داشته باشید.
به طور کلی برای برنامه نویسی سوکت در مدل کلاینت – سرور ، مبادلات زیر بین کلاینت و سرور رخ میدهد:
- در سمت سرور سوکتی را تعریف میکنیم
- به سوکت یک IP و پورت اختصاص میدهیم
- سوکت به پورت گوش میکند
- کلاینت سوکتی را تعریف میکند و IP پورت سرور را به آن اختصاص میدهد
- کلاینت درخواست اتصال یا کانکت شدن به سرور را میدهد
- سرور درخواست کلاینت را دریافت و آن را میپذیرد
- کلاینت اطلاعاتی را ارسال میکند
- سرور اطلاعات میگیرد
- سرور اطلاعات را ارسال میکند و کلاینت آن را میگیرد
- سرور بسته میشود
- کلاینت بسته میشود
پیاده سازی اصول اولیه
حال ۱۱ مرحله اصلی لازم برای اتصال سرور و کلاینت توضیح دادیم سعی میکنیم مراحل گفته شده در بالا را در زبان سی شارپ پیاده سازی کنیم. در این مقاله پیاده سازی را به کمک سوکت های سنکرون انجام میدهیم.
ابتدا برنامه سمت سرور را مینویسم:
ابتدا فضای نام های زیر را با استفاده از دستور using به کامپایلر سی شارپ معرفی کنید:
System.Net; System.Net.Sockets; System.Text;
حال یک شی سراسری و استاتیکی که در واقع نام سوکت ماست رو تعریف میکنیم:
Static Socket sktServer;
حال در متد main() این سوکت را new میکنیم تا به آن حافظه اختصاص یابد:
sktServer = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)
پارامتر اول InterNetork بدین معناست که شبکه ما از آدرس آی پی ورژن ۴ پشتیبانی میکند.
پارامتر دوم Stream به این معنا است که سوکت ما به صورت Stream داده ها را تبادل میکند.
پارامتر سوم نوع پروتکل شبکه ما را مشخص میکند که از نوع TCP است.
حال سوکت ما ساخته شده و باید آدرس و پورت آن را مشخص کنیم.
با دستور زیر میتوان این کار را انجام داد:
IPEndPoint localAd = new IPEndPoint(IPAddress.Parse(127.0.0.1),1818);
آدرس سوکت ما ۱۲۷.۰.۰.۱ و پورت آن ۱۸۱۸ است. کلاس IPEndpoint برای مشخص کردن یک کامپیوتر در شبکه به کار می رود.
اکنون باید سوکت ما به پورت گوش کند و متظر دریافت ارتباط باشد:
sktServer.Listen(100);
مقدار ۱۰۰ نشاندهنده این است که حداکثر ۴ کانکشن میتوانند در صف اتصال قرار گیرند.
حال باید وقتی کلاینت تقاضای اتصال میدهد آن را بپذیریم:
sktServer = sktServer.Accept();
حال برای دریافت داده های ارسالی باید یک بافر تعریف کنیم. توجه داشته باشید که در سوکت ها داده ها به صورت آرایه ای از بایت ها منتقل میشوند و باید آن ها را کدگذاری کنیم. با دستور زیر میتوان عمل کذگذاری را انجام داد :
Byte[] byt = Encoding.ASCII.GetBytes("hello");
دستور زیر رشته hello را رمزگشایی میکند:
String data = Encoding.ASCII.GetString(byt);
عمل گذاری در حین ارسال داده ها و رمزگشایی در حین دریافت داده ها انجام میشود. قطعه کد زیر ابتدا یک بافر ایجاد کرده و سپس داده ها را دریافت و رمزگشایی کرده و آن را چاپ میکند :
Byte[] buffer = new byte[500]; sktServer.Receive(buffer); string Data = Encoding.ASCII.GetString(buffer); Console.WriteLine(Data);
در انتها نمونه کامل یک کد ساده سمت سرور را قرار میدهم.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; namespace socketserver { class Program { static Socket sktServer; static void Main(string[] args) { sktServer = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); IPEndPoint localAd = new IPEndPoint(IPAddress.Parse("127.0.0.1"),1818); sktServer.Bind(localAd); sktServer.Listen(100); Console.WriteLine("Socket !"); sktServer = sktServer.Accept(); Byte[] buffer = new byte[500]; sktServer.Receive(buffer); string Data = Encoding.ASCII.GetString(buffer); Console.WriteLine(Data); Console.ReadKey(); } } }
**در پست های بعدی سی شارپ کد قسمت کلاینت این پروژه را قرار میدهم**
با ZeroToHero همراه باشید….
مطالب زیر را حتما مطالعه کنید
لایه network و پروتکل ipv4
روشن و خاموش کردن PC در کد سیشارپ
لایه فیزیکی (Physical)
لایه پیوند داده(Data link) در مدل OSI
آشنایی با مفهوم Load Balancing
اهمیت Monitoring محیط در دیتاسنتر ها
6 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
سلام ببخشید برای متصل کردن کامپیوتر ها از راه دور به صورت لن
مثل اینکه کامپیوتر ها با کابل وصل شده باشند باید از طریق همین آموزش اقدام کنیم؟
سلام و درود
طریقه ی ارتباط کامپیوترها با یکدیگر بستگی به توپولوژی شبکه دارد. برای مثال در شبکه ی محلی یا LAN انتظار میره که کامپیوترها بهم نزدیک باشند و طبیعتا برای متصل کردن کامپیوترها از راه دور از شبکه محلی یا LAN استفاده نمیشود. برنامه نویسی سوکت هم یکی از راه های برقراری ارتباط تحت شبکه هست و شما میتونید این ارتباط را در هر مقیاس جغرافیایی (باتوجه به ساختار شبکه) برقرار کنید.
موفق باشید
سلام. بسیار عالی بود. ساده و قابل فهم .
فقط چند سوال هم داشتم. بنده مبتدی هستم . می خواستم بدونم این کد ها برای کنسول پروگرمینگه؟ یا همون ویندوز پروگرمینگه
لطفا یک اموزش و مثال هم بزارید از یک وب سرور خیلی ساده که مثلا با متد get یک کلمه و یا ای دی رو بگیره .و متناسب با اون یک فایل html,xml,json بفرسته.
خیلی خوب و کاربردی بود
با کمی تغییر تونستم جای tcp استفاده کنم هم انعطافش بیشتره هم بهتره
سلام سمت کلاینت کی قرار میگیره؟
سلام.
قسمت مهم سمت سرور هست که نوشته شده ! برای سمت کلاینت نیاز به یه سری آموزش های دیگه از جمله Enum و Delegate و بعضی موارد دیگه هست که هنوز تکمیل نشده. بعد از تکمیل این موارد آموزش سمت کلاینت رو هم قرار میدم