PDA

نسخه کامل مشاهده نسخه کامل : سوکت پروگرمینگ



saratoos
20-10-2009, 23:54
سلام
هفته پیش که کلاس مهندسی نرم افزارم تشکیل شد استاد موضوع پروژه داد
گفت درباره سوکت پروگرمینگ
من هیچ اطلاعی دربارش ندارم:43: میشه لطفا راهنمایی کنید
ممنون می شم:31:

Mohammad King
21-10-2009, 11:07
بخش اول : سوكت هاي همگام (سنكرون منبع :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید پيش نياز : آشنايي با مفاهيم شبكه اي مانند IP و Port و Socket و Send - Receive و Client و Serverدر مدل كلاينت - سرور ، مبادلات زير بين كلاينت و سرور رخ ميدهد 1- سرور سوكتي را تعريف ميكند2 - سرور سوكت را به يك IP كه همان IP خودش است و يك پورت Bind ميكند يا اختصاص ميدهد3-سرور به پورت گوش ميدهد4- كلاينت سوكتي را تعريف ميكند و IP و پورت سرور را به آن اختصاص ميدهد5- كلاينت درخواست اتصال يا كانكت شدن به سرور را ميدهد6-سرور درخواست كلاينت را دريافت و آن را مي پذيرد7- كلاينت اطلاعاتي را ارسال مي كند8- سرور اطلاعات را مي گيرد9- سرور اطلاعات را ارسال ميكند و كلاينت آن را ميگيرد10- سرور بسته ميشود11- كلانيت بسته ميشودشكل زير اين مراحل را نمايش مي دهد :ابتدا برنامه سمت سرور را مينويسم . در اين برنامه مي بايست يك پورت را باز كرده و به آن گوش دهيم و دريافتي را نمايش دهيم .ابتدا مي بايست فضاي نامهاي زير را با استقاده از using به كامپايلر سي شارپ معرفي كنيم :SystemSystem.NetSystem.Net.SocketSystem.Textاي كار را به اين صورت انجام مي دهيم :كد:using System;using System.Net;using System.Net.Sockets;using System.Text;اكنون متغيري به نام را به صورت سراسري و static تعريف ميكنيم (از آنجايي كه متد Main يك متد static است كليه متغيرها و توابع مورد استفاده در آن نيز بايد static باشند.)متغيرها و متدهاي Static را ميتوان اينگونه تعريف كرد :متغيرها و توابعي هستند كه در يك كلاس به طور مشترك بين كليه اشياء گرفته شده از آن كلاس وجود دارند نه اينكه به ازاي هر شيء يك نمونه از آن ايجاد شود. دسترسي به اين متغيرها از طريق نام كلاس ممكن خواهد بود.در مثال زير كلاسي به نام Circle تعريف كرده ايم كه داراي يك متغير عادي به نام r است . اين متغير شعاع دايره را نگه ميدارد.متغير PI به صورت static تعريف شده است چرا كه عدد پي به ازاي كليه اشياء اين كلاس ثابت است.در كلاس MainClass از كلاس Circle يك شيء ساخته ايم و از آن استفاده كرده ايمكد: class Circle { public static float PI =3.14; public int r; public static void PrintIt(double dbl) { Console.WriteLine(dbl); } } class MainClass { static void Main(string[] args) { Circle cl = new Circle(); Console.WriteLine( Please Enter The Circle R ); cl.r = Convert.ToInt32( Console.ReadLine()); Circle.PrintIt(Circle.PI * cl.r * cl.r); } }حال به مطلب اصلي خود بازگرديم :يك شيء از كلاس سوكت به صورت سراسري و static ايجاد مي كنيم :كد:static Socket sktListener;در متد Main اين سوكت را new مينكيم تا به آن حافظه اختصاص داده شود :كد:static void Main(){ sktListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);AddressFamily.InterNetwork به معناي اين است كه از شبكه اي استفاده ميكنيم كه داراي IP نسخه 4 است.SocketType.Stream براي سوكت هايي است كه ميخواهند به صورت Stream داده ها را تبادل كنندProtocolType.Tcp كه نوع پروتكل ما را مشخص ميكند.اكنون مي بايد ِم آدرس IP و يك Port به سوكت مان اختصاص دهيم :كد:IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, 1800);sktListener.Bind(ipLocal);از آنجايي كه اين برنامه در سمت سرور اجرا ميشود آدرس IP خاصي به آن نميدهيم و پورت 1800 را باز ميكنيم. كلاس IPEndPoint براي مشخص نمودن يك نود يا يك كامپيوتر در شبكه به كار ميرود.متد Bind نود مشخص شده را به سوكت اختصاص ميدهد.اكنون زمان گوش دادن به پورت است :كد:sktListener.Listen(100);عدد 100 نشانه آن است كه حداكثر 4 connection ميتوانند در صف قرار گيرند .اگر در اين لحضه در command prompt دستور netstat –an را تايپ كنيد ميتوانيد ببينيد كه پورت 1800 باز شده و در حال گوش دادن است.حال ميبايد تقاضاي كانكت شدن كلاينت را بپذيريم :كد:sktListener = sktListener.Accept();حال براي گرفتن داده ها ، مي بايست يك بافرتعريف نماييم .نكته : در سوكت پروگرمينگ ، داده ها به صورت آرايه اي از بايت ها منتقل مي شوند. براي ارسال رشته هاي يونيكد و .... بايست آنها را كد گذاري كنيم . براي كد گذاري و كد گشايي از كلاس System.Text و متدهاي آن استفاده كنيم. مثلا دستور زير رشته salam را با فرمت Ascii به آرايه اي از بايت ها تبديل ميكندكد:byte[] byt = Encoding.ASCII.GetBytes( salam );و متد زير آن را رمزگشايي ميكند :كد:string str = Encoding.ASCII.GetString(byt);ما عمل رمزنگاري را موقع ارسال داده ها و عمل رمز گشايي را موقع دريافت آنها انجام ميدهيم .اكنون ميخواهيم داده ها را دريافت كرده و رمز گشايي كنيم :كد:byte[] buffer = new byte[500];sktListener.Receive(buffer);string Data = Encoding.ASCII.GetString(buffer);حال ميتوانيم داده ها را پردازش كنيم : كد:Console.WriteLine(Data);سورس برنامه سمت سروركد:using System;using System.Net;using System.Net.Sockets;using System.Text;static Socket sktListener;static void Main(string[] args){sktListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, 1800); sktListener.Bind(ipLocal); sktListener.Listen(100);Console.WriteLine( Waiting For The Client ); sktListener = sktListener.Accept(); byte[] buffer = new byte[500];sktListener.Receive(buffer); Console.WriteLine( --- Client Sent This Message : ); Console.WriteLine(Encoding.ASCII.GetString(buffer) );sktListener.close();}

من نمیدونم که شما درباره چیه سوکت پرو گرمینگ میخواین؟

چون موضوع زیاد هست اخت سوکت پروگیرمینگ در c در ویژوال بیسیک/ در دلفی و...

موفق باشید.

در انجمن مقالات میگفتی بهتر بود.