دوست عزیز، به سایت علمی نخبگان جوان خوش آمدید

مشاهده این پیام به این معنی است که شما در سایت عضو نیستید، لطفا در صورت تمایل جهت عضویت در سایت علمی نخبگان جوان اینجا کلیک کنید.

توجه داشته باشید، در صورتی که عضو سایت نباشید نمی توانید از تمامی امکانات و خدمات سایت استفاده کنید.
نمایش نتایج: از شماره 1 تا 4 , از مجموع 4

موضوع: سوکت پروگرامینگ در سی شارپ

Threaded View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1
    کـــــــاربر فــــعال
    رشته تحصیلی
    کامپیوتر(مهندسی نرم افزار)
    نوشته ها
    18,304
    ارسال تشکر
    4,182
    دریافت تشکر: 19,008
    قدرت امتیاز دهی
    220
    Array

    پیش فرض سوکت پروگرامینگ در سی شارپ

    در مدل کلاینت - سرور ، مبادلات زیر بین کلاینت و سرور رخ میدهد

    1- سرور سوکتی را تعریف میکند
    2 - سرور سوکت را به یک IP که همان IP خودش است و یک پورت Bind میکند یا اختصاص میدهد
    3-سرور به پورت گوش میدهد
    4- کلاینت سوکتی را تعریف میکند و IP و پورت سرور را به آن اختصاص میدهد
    5- کلاینت درخواست اتصال یا کانکت شدن به سرور را میدهد
    6-سرور درخواست کلاینت را دریافت و آن را می پذیرد

    7- کلاینت اطلاعاتی را ارسال می کند
    8- سرور اطلاعات را می گیرد
    9- سرور اطلاعات را ارسال میکند و کلاینت آن را میگیرد
    10- سرور بسته میشود
    11- کلانیت بسته میشود
    ===============================
    ابتدا برنامه سمت سرور را مینویسم .
    در این برنامه می بایست یک پورت را باز کرده و به آن گوش دهیم و دریافتی را نمایش دهیم .

    ابتدا می بایست فضای نامهای زیر را با استقاده از using به کامپایلر سی شارپ معرفی کنیم :
    کد PHP:
    کد:using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text
    اکنون متغیری به نام را به صورت سراسری و static تعریف میکنیم (از آنجایی که متد Main یک متد static است کلیه متغیرها و توابع مورد استفاده در آن نیز باید static باشند.)

    متغیرها و متدهای Static را میتوان اینگونه تعریف کرد :
    متغیرها و توابعی هستند که در یک کلاس به طور مشترک بین کلیه اشیاء گرفته شده از آن کلاس وجود دارند نه اینکه به ازای هر شیء یک نمونه از آن ایجاد شود. دسترسی به این متغیرها از طریق نام کلاس ممکن خواهد بود.
    در مثال زیر کلاسی به نام Circle تعریف کرده ایم که دارای یک متغیر عادی به نام r است . این متغیر شعاع دایره را نگه میدارد.
    متغیر PI به صورت static تعریف شده است چرا که عدد پی به ازای کلیه اشیاء این کلاس ثابت است.
    در کلاس MainClass از کلاس Circle یک شیء ساخته ایم و از آن استفاده کرده ایم

    کد:
    کد PHP:
    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.Convert.ToInt32Console.ReadLine());

    Circle.PrintIt(Circle.PI cl.cl.r);
    }

    حال به مطلب اصلی خود بازگردیم :
    یک شیء از کلاس سوکت به صورت سراسری و static ایجاد می کنیم :
    کد:
    کد PHP:
    static Socket sktListener
    در متد Main این سوکت را new مینکیم تا به آن حافظه اختصاص داده شود :
    کد:
    کد PHP:
    tatic void Main()
    {
    sktListener = new Socket(AddressFamily.InterNetworkSocketType.StreamProtocolType.Tcp); 
    AddressFamily.InterNetwork به معنای این است که از شبکه ای استفاده میکنیم که دارای IP نسخه 4 است.
    SocketType.Stream برای سوکت هایی است که میخواهند به صورت Stream داده ها را تبادل کنند

    ProtocolType.Tcp که نوع پروتکل ما را مشخص میکند.

    اکنون می باید ِم آدرس IP و یک Port به سوکت مان اختصاص دهیم :
    کد:
    کد PHP:
    IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any1800);
    sktListener.Bind(ipLocal); 
    از آنجایی که این برنامه در سمت سرور اجرا میشود آدرس IP خاصی به آن نمیدهیم و پورت 1800 را باز میکنیم. کلاس IPEndPoint برای مشخص نمودن یک نود یا یک کامپیوتر در شبکه به کار میرود.

    متد Bind نود مشخص شده را به سوکت اختصاص میدهد.

    اکنون زمان گوش دادن به پورت است :
    کد:
    کد PHP:
    sktListener.Listen(100); 
    عدد 100 نشانه آن است که حداکثر 4 connection میتوانند در صف قرار گیرند .
    اگر در این لحضه در command prompt دستور netstat –an را تایپ کنید میتوانید ببینید که پورت 1800 باز شده و در حال گوش دادن است.
    حال میباید تقاضای کانکت شدن کلاینت را بپذیریم :
    کد:
    کد PHP:
    sktListener sktListener.Accept(); 
    حال برای گرفتن داده ها ، می بایست یک بافرتعریف نماییم .
    نکته : در سوکت پروگرمینگ ، داده ها به صورت آرایه ای از بایت ها منتقل می شوند. برای ارسال رشته های یونیکد و .... بایست آنها را کد گذاری کنیم . برای کد گذاری و کد گشایی از کلاس System.Text و متدهای آن استفاده کنیم. مثلا دستور زیر رشته salam را با فرمت Ascii به آرایه ای از بایت ها تبدیل میکند
    کد:
    کد PHP:
    byte[] byt Encoding.ASCII.GetBytes("salam"); 
    و متد زیر آن را رمزگشایی میکند :
    کد:
    کد PHP:
    string str Encoding.ASCII.GetString(byt); 
    ما عمل رمزنگاری را موقع ارسال داده ها و عمل رمز گشایی را موقع دریافت آنها انجام میدهیم .
    اکنون میخواهیم داده ها را دریافت کرده و رمز گشایی کنیم :
    کد:
    کد PHP:
    byte[] buffer = new byte[500];
    sktListener.Receive(buffer);
    string Data Encoding.ASCII.GetString(buffer); 
    حال میتوانیم داده ها را پردازش کنیم :
    کد:
    کد PHP:
    Console.WriteLine(Data); 
    ====================================
    سوکت های آسنکرون

    کدهایی که تا به اینجا دیدیم برای ایجاد سوکت های همگام یا سنکرون بوده است. این سوکت ها در برنامه های ویندوز و کلا سیستم های مالتی تسک کاربردی ندارند. چرا که بالفرض در زمانی از متد accept استفاده نموده ایم، در این حالت برنامه تا رسیدن یک سوکت به آن قفل شده و قادر به انجام کاری نیست.

    در سوکت های آسنکرون از متدهای آسنکرون برای گوش دادن ، ارسال ، دریافت و ... استفاده میکنیم.در این مقاله ، یک برنامه سمنت سرور به صورت آسنکرون طراحی میکنیم که قادر به گوش دادن به یک کلاینت است.

    نکته : قبل از ادامه ، آشنایی با delegate ها الزامی است. میتوانید delegate ها را در مقاله مربوطه مشاهده فرمایید ولی اگر بخواهیم در یک جمله Delegate ها را تعریف کنیم میتوانیم بگوییم :
    delegate در حقیقت چیزی نیست جز اشاره گر به تایع !

    در سوکت های آسنکرون ، از delegate ای به نام AsyncCallback استفاده میکنیم. این Delegate به تابعی اشاره میکند که تنها یک آرگومان ورودی از نوع IAsyncResult دارد. متدهایی که به صورت آسنکرون کار میکنند ، اطلاعات مورد نظر خود را به صورت یک شی از این توع به تابع مورد نظر خود ارسال میکنند.

    نکته : متدهای آسنکرون با پیشوندهای Begin و End شروع میگردند.

    برای نوشتن برنامه ، ابتدا یک سوکت تعریف میکنیم که عمل گوش دادن را انجام دهد :

    کد:
    کد PHP:
    Socket Mainlistener = new Socket(AddressFamily.InterNetworkSocketType.StreamProtocolType.Tcp); 
    سپس عملیات معمول را بر روی سوکت انجام میدهیم :

    کد:
    کد PHP:
    IPEndPoint server = new IPEndPoint(IPAddress.Any1800);
    Mainlistener.Bind(server); 
    همانگونه که میبینید ، در این برنامه سوکت مورد نظر ما به پورت 1800 گوش میدهد.

    اکنون زمان آن است که یک delegate ایجاد کرده و آن را به تایع پردازشگر که در این مثال AcceptCallBack نام دارد ، منتسب کنیم .


    کد:
    کد PHP:
    AsyncCallback callBackMethod = new AsyncCallback(AcceptCallback); 
    اکنون باید سوکت تعریف شده به صورت غیر همگام ( آسنکرون) شروع به گوش دادن به پورت کند :

    کد:
    کد PHP:
    Mainlistener.Listen(4);
    Mainlistener.BeginAccept(AcceptCallback,Mainlistener); 
    در این مثال ، مشخص کرده ایم که سوکت شروع به عمل گوش دادن و انتظار کند و سپس به محض کانکت شدن یک کلاینت به کامپیوتر ما ، تابع AcceptCallBack اجرا گردد و به اموری که تعیین میکنیم رسیدگی کند.

    نکته : پارامتر دوم تابع BeginAccept ، شیء ای است برای ارسال داده های وضعیت سوکت به تابعی که به سوکت رسیدگی میکند . در این جا این شیء خود سوکت است . اگر سوکت را به صورت سراسری تعریف میکردیم ، نیاز به ارسال این شیء نبود و به جای آن null قرار می دادیم. شیء مربوطه در قالب یک شیء از کلاس IAsyncResult ارسال خواهد شد.

    تابع AcceptCallback بایستی اینگونه تعریف شود.

    کد:
    کد PHP:
    private void AcceptCallback(IAsyncResult ar)
    {
    ...

    تابع AcceptCallback بایستی اینگونه تعریف شود.

    کد:
    کد PHP:
    private void AcceptCallback(IAsyncResult ar)
    {
    ...

    در این تابع ، آرگومانی از نوع IAsyncResult وجود دارد. این آرگومان اطلاعات وضعیت فراخوان تابع آسنکرون که در اینجا یک سوکت است را نگهداری میکند. ابتدا این اطلاعات را استخراج میکنیم :



    کد:
    کد PHP:
    Socket temp = ((Socket)ar.AsyncState); 

    سپس به گوش دادن برای پذیرفتن کلاینت خاتمه میدهیم چرا که اکنون دیگر کلاینت مورد نظر به سرور کانکت شده و آماده برای ارسال اطلاعات است :


    کد:
    کد PHP:
    Socket worker temp.EndAccept(ar); 
    نکته : دو دستور قبل را میتوانستیم در قالب یک دستور و به این شکل بنویسیم :


    کد:
    کد PHP:
    Socket temp = ((Socket)ar.AsyncState).EndAccept(ar); 

    بسیار خوب، اکنون که ارتباط کلاینت با برنامه ما برقرار گردیده است ، کافی است تا به صورت آسنکرون به دریافت اطلاعات مشغول شویم. باز هم مانند قسمت قبل، از متدهای آسنکرون استفاده کرده و تابعی تعیرف میکنیم که به محض دریافت اطلاعات فراخوانی گردیده و عملیات مورد نظر ما را انجام دهد.

    نکته ای که بسیار حائز اهمیت است این که بایستی از یک بافر برای ذخیره اطلاعات دریافتی استافده کنیم. این بافر که در حقیقت آرایه ای از بایتها است به صورت یک آرایه سراسری تعریف میکنیم :


    کد:
    کد PHP:
    byte[] buffer = new byte[1024]; 
    نکته : با توجه به این که در این برنامه صرفا یا یک کلاینت کار میکنیم ، سراسری بودن بافر مشکلی ایجاد نمیکند، اما چنانچه قصد داشتیم با چند کلاینت کار کنیم برای هریک میبایست بافر مخصوص به خودش را تعریف میکردیم که اصولا پیاده سازی آن برنامه به گونه ای دیگر خواهد بود که در مقالات آتی مورد بررسی قرار خواهد گرفت.

    برای دریافت اطلاعات به صورت آسنکرون ، از متد BeginReceive استفاده میکنیم. البته بایستی بافر، اندیس اولیه ای که میخواهیم بافر از آنجا پر شود و همچنین اندیس حد نهایی بافر را مشخص کنیم.

    کد:
    کد PHP:
    AsyncCallback ReceiveMethod = new AsyncCallback(ReceiveCallBack);
    worker.BeginReceive(buffer0buffer.LengthSocketFlags.None,new  
                      
    ReceiveMethodworker); 
    پس تا اینجا ، متد AcceptCallback به این صورت است :


    کد:
    کد PHP:
    private void AcceptCallback(IAsyncResult ar)
    {
     
    Socket temp = ((Socket)ar.AsyncState);
     
    Socket worker temp.EndAccept(ar);
     
    AsyncCallback ReceiveMethod = new AsyncCallback(ReceiveCallBack);
     
    worker.BeginReceive(buffer0buffer.LengthSocketFlags.None,new  
                      
    ReceiveMethodworker);

    اکنون متد ReceiveCallBack را تعریف میکنیم :


    کد:
    کد PHP:
    private void ReceiveCallBack(IAsyncResult ar)
    {
    ...

    درون این متد ، ابتدا اطلاعات وصعیت را بدست می آوریم :


    کد:
    کد PHP:
    Socket worker = ((Socket)ar.AsyncState); 

    سپس به گوش دادن به صورت موقت خاتمه میدهیم تا بتوانیم داده های فعلی را پردازش کنیم. این کار را با متد EndReceive انجام میدهیم . مقدار بازگشتی این متد تعداد بایتهای دریافت شده میباشد :



    کد PHP:
    int bytesReceived worker.EndReceive(ar); 

    حال میبایست اطلاعات دریافت شده که به صورت آرایه ای بایتها درون بافر هستند را پردازش کرده و جهت نمایش به رشته (string) تبدیل کنیم :

    کد:
    کد PHP:
    string str System.Text.UTF8Encoding.UTF8.GetString(buffer); 

    منبع Persiantools
    شنبه : یارب العالمین 1شنبه : یا ذاالجلال والاکرام
    2شنبه : یا قاضی الحاجات 3شنبه : یاارحم الراحمین
    4شنبه : یا حی یاقیوم 5شنبه : لا اله الا الله الملک الحق المبین
    جمعه : اللهم صل علی محمد وال محمد وعجل فرجهم

  2. 3 کاربر از پست مفید آبجی سپاس کرده اند .


اطلاعات موضوع

کاربرانی که در حال مشاهده این موضوع هستند

در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)

موضوعات مشابه

  1. آموزشی: تجهیزات هوشمند پژو 206
    توسط kab در انجمن خودروهای ساخت و مونتاژ خارج
    پاسخ ها: 1
    آخرين نوشته: 24th April 2010, 01:25 PM
  2. خبر: بحران حریف شارپ نشد
    توسط MAHDIAR در انجمن اخبار و معرفی جدیدترین سخت افزارها
    پاسخ ها: 0
    آخرين نوشته: 23rd January 2010, 11:27 AM
  3. آموزشی: مقدمه ای بر سی شارپ c#
    توسط آبجی در انجمن مقاله ها و آموزش های مربوط به برنامه نویسی
    پاسخ ها: 19
    آخرين نوشته: 20th January 2010, 10:10 PM
  4. معرفی: شارپ پیشرفته‌ترین کارخانه تولید hdtv دنیا را تأسیس کرددی ۱۷
    توسط MAHDIAR در انجمن اخبار و معرفی جدیدترین سخت افزارها
    پاسخ ها: 0
    آخرين نوشته: 7th January 2010, 01:49 PM
  5. سوال: منظور از am2 و am3 چیست؟
    توسط zizo در انجمن بخش سوالات و رفع ایرادات کامپیوتری
    پاسخ ها: 6
    آخرين نوشته: 17th September 2009, 11:29 PM

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •