مفیدترین پستها به نظر کاربران در این تاپیک را در اینجا ببینید!

+ پاسخ به مبحث
صفحه 1 از 2 12 آخرآخر
نمایش نتایج 1 تا 10 از 12

مبحث: دانلود کتاب سوکت پروگرامینگ فارسی

  1. #1
    sara.NET
    Guest


    تعداد 1 نفر از 1 کاربر این پست را مفید دانسته اند! به نظر شما این پست مفید است؟ بله | خیر

    Arrow دانلود کتاب سوکت پروگرامینگ فارسی

    آگهی تبلیغات (برای حمایت از گیگاپارس)
    دانلود کتاب سوکت پروگرامینگ فارسی
    • [تنها کاربرانی که عضو شده اند و از طریق ایمیل عضویتشان فعال شده می تواند این لینک را ببینند. ]

  2. 3 نفر از sara.NET برای این مطلب مفید تشکر کرده اند:


  3. #2
    sara.NET
    Guest


    به نظر شما این پست مفید است؟ بله | خیر

    Arrow آموزش Socket Programming

    آموزش Socket Programming

    Socket Programming در ارتباطات شبکه قراردادهايی استفاده می شود تحت عنوان Protocol ,
    پروتکولهای مختلفی ايجاد شده اما در ارتباطات اينترنتی و شبکه هايی که ارتباط ۲ طرفه است
    بيشتر از نوع( TCP/IP ) استفاده ميشه که اساس اون به صورت خيلی مختصر اينه که برای هر
    کامپيوتر که به شبکه (که اینترنت هم یه شبکه هستش !!) وصله يه IP مخصوص به خودش رو داره و به نوعی آدرس اون کامپيوتر محسوب ميشه که تمام خصوصيات يه آدرس رو که ميشه متصور شد داراست .
    اما چرا گفتم در شبکه هايی که ارتباط ۲ طرفه نيازه از ( TCP/IP ) استفاده ميشه ؟
    چون انواع ديگری هم از جمله UDP هستند که تقريبا ارتباط يکطرفه ميباشد مثلا برای پخش برنامه های راديويی .
    -----------------------------------------------------------------------------------
    اصلی ترين عامل در يک ارتباط شبکه ای Socket ميباشد که اعمال شبکه را بصورت خواندن و
    نوشتن در يک فايل شبيه سازی نموده است . سوکت در اصل مانند يک کانال ارتباطی است
    که ميان دو نقطه ايجاد شده و پيغامها رد و بدل ميشود.
    برای داشتن يک ارتباط شبکه ای بايد يک سوکت ايجاد کنيم ( منظور نرم افزاری هستشا !! )
    که لازمه اين کار اينه که بدانيم برای گوش دادن داريم ايجاد ميکنيم يا برای فرستادن پيام .
    اگه برای فرستادن پيام باشه که پر واضحه که نياز به آدرس مقصد داريم . اما اين کافی نيست !!!
    امروزه آپارتمان نشينی رونق گرفته و تو کامپيوتر هم نفوذ کرده !!!!
    برای فرستادن نامه امروزه تنها آدرس ساختمون طرف کافی نيست و نياز به شماره واحد اون هو هست .
    اين فقط يه تمثيل بود ! درسته تو کامپيوتر هم فقط IP کافی نيست و شماره واحد برنامه ای که گوش به زنگه هم نيازه که به اون Port ميگن . يعنی شماره پورت هم نيازه .
    اما يه چيز يادم رفت بگم که IP از ۴ عدد ۰تا۲۵۵ تشکيل شده که با نقطه از هم جدا ميشن مثلا : ۱۶۸.۲۳.۵۶.۹۸ يه IP هستش . اما پورت اعدادی بين ۱ تا (بصورت رایج) ۶۵۰۰۰ را ميتونه شامل بشه .(بله بزرگتر از این عدد هم میتونه شماره پورت بشه اما چه کاریه !!!)

    اينجا ممکنه يه سوال پيش بياد که مگه نه اينکه هر کامپيوتر فقط يه IP داره پس يعنی در يه لحظه آيا فقط به يه کامپيوتر ميتونه وصل شه ؟؟
    جواب منفی است
    درسته که IP يکی بيشتر نيست اما تعداد معتنابهی پورت داريم
    يعنی با هر پورت به يه کامپيوتر متصل ميشيم و ميتونيم تا ۶۵۰۰۰ (می دونم بیشتره ;-) ) ارتباط از صدقه سری پورتها داشته باشيم .

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

    -----------
    اولين نکته ای که لازمه بگم اينه که تو استفاده از سوکت در اول ايجاد پروژه حتما بايد چک باکس مربوط به WinSock رو تيک کنيد که تو درس بعدی با جزئيات بيشتری خواهم گفت .

    در برنامه نويسی سوکت ۲ نوع ارتباط خواهيم داشت :

    الف ) در هنگام دريافت يا ارسال پيغام تمام برنامه متوقف می شود که در بسیاری از موارد اصلا مطلوب نيست

    ب) بر اساس Event پايه گذاری می شود که هر موقع پيغامی منتظر دريافت شدن بود آنرا دريافت کند و هر موقع پيغام آماده فرستادن بود آنرا بفرستد و کل برنامه از کار نيافتد که در اکثر موارد اين روش استفاده می شود .

    -----------------------------------------------
    تمام نيازهای مارا يک کلاس به نام CAsyncSocket تامين می کند . که با ساختن شئ از آن می توانيم به امکاناتی نظير send , Receive ,... دسترسی داشته باشيم که مفصلترش رو توضيح خواهم داد . که هرچی بعد از این از توابع اسم میبرم مربوط به این کلاس هستش

    برای اين نوع ارتباط که داريم بحث می کنيم ۲ جور سوکت بايد بسازيم :

    ۱- برای فرستادن
    ۲- برای گوش دادن یا همون دریافت

    برای ايجاد سوکت از متد;( ) Create استفاده میشه که ۲ نوع آن به این شکل است که :
    ۱- برای نوع فرستادن تنها کافیست که این متد بدون پارامتر صدا زده شود : ;( ) Create
    ۲- برای نوع دریافت کردن ۱ پارامتر نیاز دارد و آن شماره پورت برای دریافت کردن میباشد که به طور مثال :;( ۱۷۵۳) Create

    -----------------------------------------------
    بعد از ایجاد سوکت کار بعدی وصل شدن به برنامه مقصد هستش که منتظر دریافت پیغام هستش .
    این کار از جانب فرستنده پیغام شروع میشه که باید متد;( ) Connect صدا زده بشه .
    این متد ۲ پارامتر نیاز دارد :

    ۱- IP کامپیوتر مقصد یا آدرس تحت وب آن مثلا :" www.taraf.com" ( اگر در یک شبکه محلی میخواید وصل بشید اسم کامپیوتر هم میتونه جای IP به کار بره ) که بصورت یه رشته خواهد بود
    ۲- شماره پورت کامپيوتر مقصد که گوش به زنگ هستش

    مثلا : ;(۱۳۶۵,"192.۱68. 12 .39")Connect

    ---------------------------------------------------
    اما قبل وصل شدن نيازه که گوش به زنگ بشيم تا بتونيم درخواستهای اتصال رو جواب بديم برای اين کار از متد;( ) Listen بدون هيچ پارامتری استفاده ميکنيم تا سوکت دريافت آماده بشه .

    ---------------------------------------------------
    حالا که به اينجا رسيديم وقتی تقاضای وصل شدن از سمت يه کامپيوتر ديگه به ما ميرسه رو بايد قبول کنيم :
    گوش به زنگ هستيم که اگه تقاضايی رسيد با متد ;( ) Accept قبولش کنيم
    اين متد يه پارامتر ميگيره و اون يه شئ از کلاس CAsyncSocket هستش که وظيفه دريافت متن پيغامهای بعد از متصل شدن رو به عهده ميگيره .

    --------------------------------------------------
    برای فرستادن پيغام از متد ;( ) Send استفاده ميکنيم که ۲ پارامتر ميگيرد :

    ۱- اشاره گر به بافر داده مورد نظر برای فرستادن است که با استفاده از تابع;(‌ ) LPCTSTR استفاده ميکنيم که يک پارامتر ورودی دارد و آن متغييری است که پيغام ما در آن است .
    ۲- طول بافر که همان طول پيغام می باشد

    مثلا اگه پيغام در متغييری به نام str باشه به شکل زير ميفرستيم :
    ; (()str.GetLengthو(Send(LPCTSTR(str

    -------------------------------------------------
    وقتی پیغام به گوش دهنده برسه یه Eventبه نام;( ) OnReceive فعال میشه که با متد ;( )Receive پيغام را دريافت می کند که ۲ پارامتر می گيرد :

    ۱- اشاره گر به يک بافر که ميتواند يک رشته کاراکتری باشد
    ۲- طول بافر مورد نظر که به چه طولی از پيغام را مي خاهيم دريافت کنيم

    بعد از اتمام کار با سوکت باید انرا ببندیم که این کار با متد ;( ) Close صورت میگیرد
    • [تنها کاربرانی که عضو شده اند و از طریق ایمیل عضویتشان فعال شده می تواند این لینک را ببینند. ]
    منبع : irvirus.com

  4. #3
    sara.NET
    Guest


    به نظر شما این پست مفید است؟ بله | خیر

    Arrow برنامه نويسي شبكه در CSharp - پیدا کردن یک میزبان در شبکه

    برنامه نويسي شبكه در CSharp - پیدا کردن یک میزبان در شبکه

    در برنامه ای که در این قسمت تشریح می کنیم، نشان می دهیم که چطور می توان یک میزبان (Host) را در شبکه هدف قرار داد و به اطلاعات DNSی آن میزبان دسترسی داشت.


    [تنها کاربرانی که عضو شده اند و از طریق ایمیل عضویتشان فعال شده می تواند این لینک را ببینند. ]




    تشریح فضاهای نام و کلاس های مورد نیاز
    در این برنامه از فضای نام System.Net برای استفاده از کلاس های Dns, IPHostEntry, IPAddress و فضای نام System.Net.Sockets برای مدیریت کردن استثناء هایی که ممکن است در خلال برنامه رخ دهد استفاده خواهیم کرد.
    توسط متد GetHostName() از کلاس Dns می توان به نام کامپیوتر محلی و یا همان Local Host دسترسی داشت. توسط متد GetHostEntry(…) از کلاس Dns می توان به اطلاعات DNSی مربوط به یک میزبان (Host) مشخص دسترسی داشت. این متد یک پارامتر دریافت می کند که پارامتر آن می تواند یا آدرس IP میزبان و یا نام میزبان مورد نظر باشد. به عنوان مثال پارامتر می تواند به فرم های 192.168.0.1 و یا comp10 و یا www.microsoft.com باشد. و اما خروجی این متد از نوع کلاس IPHostEntry بوده و توسط objectی از این کلاس می توانیم اطلاعات DNSی دریافت شده میزبان مورد نظر را در خروجی چاپ کنیم.
    همانطور که گفته شد اطلاعات خروجی متد GetHostEntry(…) در قالب کلاس IPHostEntry می باشد. از این پس می توانیم توسط سه خصوصیت HostName, AddressList و Aliases از کلاس IPHostEntry کلیه اطلاعات DNSی میزبان مورد نظر را مشاهده کنیم. توسط خصوصیت HostName از کلاس IPHostEntry می توان به نامی که برای میزبان در DNS ثبت شده است دسترسی داشت. توسط خصوصیت AddressList از کلاس IPHostEntry که خروجی آن آرایه ای از نوع کلاس IPAddress می باشد، می توان به IPهایی که در DNS برای میزبان ثبت شده است دسترسی داشت و توسط خصوصیت Aliases از کلاس IPHostEntry که خروجی آن یک آرایه رشته ای است، می توان به نام های مستعاری که در DNS برای میزبان مورد نظر ثبت شده است، دسترسی داشت.
    و اما کلاس IPAddress، این کلاس برای کار بر روی آدرس های IP متدهایی در اختیار برنامه نویس قرار می دهد که کار کردن با آدرس های IP را راحت می کند. به عنوان مثال توسط متد Parse(…) از این کلاس می توان یک آدرس IP که به صورت رشته می باشد را به یک آدرس IP 32 بیتی مورد استفاده در ساختار شبکه ها تبدیل کرد.
    تشریح کدهای برنامه
    در این برنامه یک روال به نام PrintHostInfo وجود دارد که توسط آن کلیه اطلاعات DNSی میزبانی که نام آن را در txtURL نوشته ایم بدست آورده و در txtMessage چاپ می کنیم. پس در ابتدا بهتر است کد های این روال را توضیح دهیم.

    کد:
    1  public void PrintHostInfo(String host)
    2  {
    3      try
    4      {
    5         IPHostEntry hostInfo;
    6         // Attempt to resolve DNS for given host or address
    7         hostInfo = Dns.GetHostEntry(host);
    8         // Display the primary host name                   
    9   txtMessage.Text += "\r\nCanonical Name: "
    10                       + hostInfo.HostName + "\r\n";
    11        // Display list of IP addresses for this host
    12   txtMessage.Text += "IP Addresses:\r\n";
    13   foreach (IPAddress ipaddr in hostInfo.AddressList)
    14        {
    15           txtMessage.Text += ipaddr.ToString() + "\r\n";
    16        }
    17        // Display list of alias names for this host
    18   txtMessage.Text += "Aliases:\r\n";       
    19        foreach (String alias in hostInfo.Aliases)
    20        {
    21           txtMessage.Text += alias + "\r\n";
    22        }
    23     }   
    24     catch (Exception)
    25     {
    26        MessageBox.Show("Unable to resolve host: " + host);
    27     }
    28 } // end method PrintHostInfo 

    در خط شماره 5 یک object به نام hostInfo از نوع کلاس IPHostEntry تعریف می کنیم تا از این object برای قرار دادن اطلاعات DNSی میزبان مورد نظر استفاده کنیم. در خط شماره 7 توسط متد GetHostEntry(host) از کلاس Dns کلیه اطلاعات DNSی میزبانی که نام آن را توسط پارامتر host به این روال ارسال کرده ایم بدست آورده و در متغیر hostInfo قرار می دهیم. خط شماره 9 و 10 نام میزبان مورد نظر را به همراه یک پیغام دیگر ترکیب کرده و در txtMessage قرار می دهد. توجه کنید که این نام همان نامی است که به عنوان Computer Name در کامپیوتر تنظیم می کنید. خطوط 13 الی 16 کلیه IPهایی که برای این میزبان در DNS ثبت شده است را در txtMessage قرار می دهد. دستور hostInfo.AddressList یک آرایه ای را مشخص می کند که شامل کلیه IPهایی است که در DNS برای میزبان ثبت شده است. و دستور خط 13 می گوید برای هر IPای که در AddressList است کد داخل حلقه foreach اجرا شود. خطوط 19 الی 22 همانند قسمت قبل کلیه نام های مستعاری که برای میزبان در DNS ثبت شده است را در txtMessage قرار می دهد.
    اگر در هنگام وارد کردن نام میزبان در txtURL یک نام نامعتبر وارد کنید برنامه در هنگام اجرای کد در خط 7 با یک استثناء مواجه می شود. برای مدیریت این خطا ها در برنامه، کدها را در بلوک try, catch قرار می دهیم.
    کدهایی که در رویداد Load مربوط به فرم برنامه قرار دارد به شرح زیر می باشد:


    کد:
    1   // Get and print local host info
    2   try
    3   {
    4      txtMessage.Text = "*** LOCAL HOST ***" + "\r\n";
    5      String localHostName = Dns.GetHostName();
    6      txtMessage.Text += "Host Name: " + localHostName;
    7      PrintHostInfo(localHostName);
    8   }
    9   catch (Exception)
    10  {
    11     MessageBox.Show("Unable to resolve local host.\n\r");
    12  }


    در خط شماره 5 توسط متد GetHostName() از کلاس Dns نام کامپیوتر محلی و یا همان Local Host از سیستم دریافت شده و در متغیر رشته ای LocalHostName قرار می گیرد. در واقع این دستور نام همان کامپیوتری که برنامه در آن اجرا می شود را به دست می آورد. در خط شماره 7 و توسط کدPrintHostInfo(localHostName); نام کامپیوتر محلی به روال PrintHostInfo() ارسال می گردد تا اطلاعات کامپیوتر محلی در txtMessage قرار گیرد. (همانطور که در شکل فوق مشاهده می شود). همانطور که مشاهده می کنید باز هم کدها در بلاک try, catch نوشته شده اند. چون ممکن است هنگام اجرای متد PrintHostInfo() در تحلیل میزبان با خطا مواجه شویم.
    کدهایی که در رویداد Click مربوط به دکمه Resolve قرار دارد به شرح زیر می باشد:


    کد:
    1 // Get and print remote host info
    2  txtMessage.Clear();
    3  txtMessage.Text = "*** REMOTE HOST ***";
    4  PrintHostInfo(txtURL.Text);

    در خط شماره 4 روال PrintHostInfo() فراخوانی می شود و مقداری که کاربر در txtURL وارد کرده است به عنوان پارامتر به این روال ارسال می گردد. حال روال PrintHostInfo() میزبان مورد نظر را در شبکه جستجو کرده و اطلاعات DNSی آن میزبان را در txtMessage قرار می دهد.

    [تنها کاربرانی که عضو شده اند و از طریق ایمیل عضویتشان فعال شده می تواند این لینک را ببینند. ]
    اخرین ویرایش توسط sara.NET : 16-07-2009 at 10:29 PM

  5. #4
    sara.NET
    Guest


    به نظر شما این پست مفید است؟ بله | خیر

    Arrow برنامه نويسي شبكه در CSharp - برنامه Server و Client با پروتكل TCP

    برنامه نويسي شبكه در CSharp - برنامه Server و Client با پروتكل TCP

    در این قسمت از آموزش برنامه نویسی شبکه در C# یک برنامه Client و یک برنامه Server تحت Consol خواهیم نوشت که این دوبرنامه برای برقراری ارتباط با هم از پروتکل TCP استفاده می کنند. در واقع این دو برنامه از طریق یک سوکت TCP با هم ارتباط برقرار خواهند کرد و برنامه Client یک رشته متنی Hello Server! را به Server ارسال کرده و Server بعد از دریافت این رشته، دوباره همین رشته را به Client برمی گرداند.
    توجه: برای اجرای برنامه ابتدا برنامه Server و سپس برنامه Client را اجرا کنید.

    [تنها کاربرانی که عضو شده اند و از طریق ایمیل عضویتشان فعال شده می تواند این لینک را ببینند. ]
    [تنها کاربرانی که عضو شده اند و از طریق ایمیل عضویتشان فعال شده می تواند این لینک را ببینند. ]



    وقتی دو برنامه تحت شبکه از طریق پروتکل TCP با هم ارتباط برقرار می کنند مثل این است که کانالی بین آنها بوجود می آید. این کانال ارتباطی تا وقتی وجود خواهد داشت که یکی از دو برنامه ارتباط را قطع کند. ارسال اطلاعات بین دو برنامه از طریق همین کانال صورت می گیرد. برنامه ارسال کننده اطلاعات لازم نیست در هر بار ارسال اطلاعات آدرس مقصد را به همرا ه بسته ارسال کند، زیرا این کانال ارتباطی به طور منطقی به مقصد متصل است. علاوه بر آن این کانال یک پل ارتباطی قابل اعتمادی را ایجاد می کند به طوری که توالی بایت های دریافت شده در مقصد همان توالی بایت هایی است که فرستنده در کانال قرار داده است. به همین دلیل پروتکل TCP را پروتکل اتصال گرا (Connection Oriented) می نامند.
    تشریح فضاهای نام و کلاس های مورد نیاز
    محیط کاری .NET دو کلاس مخصوص TCP فراهم می کند که عبارت اند از TcpClient و TcpListener. نمونه ای و یا objectی از هر یک از این کلاس ها، یک طرف اتصال TCP را مشخص می کند. در اتصال TCP سمت مقابل (برنامه ای بر روی کامپیوتر مقابل) توسط یک آدرس IP و یک شماره پورت مشخص می شود. برقراری ارتباط به این صورت است که TCP سرویس گیرنده یک تقاضای اتصال به TCP سرویس دهنده ارسال می کند و در این سمت objectی از کلاس TcpListener به تقاضا های اتصال TCP گوش فرا می دهد و با ورود اولین درخواست، یک سوکت TCP بین خودش و سرویس گیرنده ایجاد می کند.
    تشریح برنامه سرویس گیرنده (TCPEchoClient)
    در برنامه سرویس گیرنده از فضای نام System.IO برای IOExceptionها و از فضای نام System.Net.Sockets برای استفاده از دو کلاس TCPClient و NetworkStream و همچنین مدیریت استثنا های SocketException استفاده شده است.
    توسط objectی از کلاس TCPClient می توان یک سوکت در سمت Client برای برقراری ارتباط با Server ایجاد کرد. در هنگام ساختن objectی از این کلاس می توان نام Server و شماره پورتی که سرور مشغول گوش دادن به آن است را مشخص کرد. کلاس بعدی کلاس NetworkStream می باشد که توسط objectی از این کلاس و همچنین توسط متد GetStream() از کلاس TCPClient می توان به کانال ارتباطی که بعد از برقرای اتصال بین سرویس گیرنده و سرویس دهنده برقرار می شود دسترسی داشت. از این پس می توان با استفاده از متد های Write(…) و Read(..) مربوط به کلاس NetworkStream اطلاعات را در کانال نوشت و یا از آن خواند. اطلاعاتی که قرار است در کانال به منظور ارسال به سمت مقابل قرار گیرد باید به صورت یک آرایه بایتی باشد.
    تشریح کدهای برنامه سرویس گیرنده
    همانطور که گفته شد این برنامه یک برنامه Consol Application می باشد و در ذیل کدهای تابع Main() برنامه آورده شده است که به تشریح این کدها خواهیم پرداخت.
    کد:
    1  static void Main(string[] args)
    2  {            
    3      TcpClient client = null;
    4      NetworkStream netStream = null;
    5      try
    6      {
    7         // create socket that is connected to server on specified port
    8         client = new TcpClient("127.0.0.1", 8000);                
    9         netStream = client.GetStream();
    10        byte[] byteBuffer = Encoding.ASCII.GetBytes("Hello Server!");
    11        // send the encoded string to the server
    12        netStream.Write(byteBuffer, 0, byteBuffer.Length);
    13        Console.WriteLine(byteBuffer.Length + " bytes sent to server.");
    14        int totalBytesRcvd = 0; // total bytes received so far
    15        int byteRcvd = 0;       // bytes received in last read
    16        // receive the same string back from the server
    17        while (totalBytesRcvd < byteBuffer.Length)
    18        {      
    19           if ((byteRcvd = netStream.Read(byteBuffer,totalBytesRcvd,
    20                             byteBuffer.Length - totalBytesRcvd))== 0)
    21           {
    22              Console.WriteLine("Connection closed.");
    23              break;
    24           } // end if
    25           totalBytesRcvd += byteRcvd;
    26        } // end while
    27        Console.WriteLine(byteBuffer.Length + 
    28                " bytes received from server >>> " +
    29        Encoding.ASCII.GetString(byteBuffer,0,byteBuffer.Length));
    30     } // end try
    31     catch (Exception err)
    32     {
    33        Console.WriteLine(err.ToString());
    34     } // end catch
    35     finally
    36     {
    37        netStream.Close();
    38        client.Close();
    39        Console.ReadKey();
    40     } // end finally
    41 } // end method main
    در خط شماره 3 یک شی به نام client از کلاس TcpClient می سازیم که از این شی برای برقراری ارتباط با سروری که شماره IP و شماره پورت آن را می دانیم استفاده می کنیم. همانطور که گفتیم، وقتی که دو کامپیوتر از طریق TCP با هم اتباط برقرار می کنند، بین آنها یک کانال ارتباطی برقرار می شود که این کانال تا زمانی که یکی از دو کامپیوتر ارتباط را قطع نکرده باشند برقرار است. در خط شماره 4 یک شی به نام netStream از کلاس NetworkStream ساخته می شود تا بعد از برقراری اتصال با سرور بتوانیم توسط این شی از کانال ارتباطی استفاده کنیم.
    در خط شماره 8 شی client را توسط سازنده کلاس TcpClient که دو پارامتر دریافت می کند مقدار دهی می کنیم. پارامتر اول سازنده، نام کامپیوتر مقصد (Server) و پارامتر دوم، شماره پورت در کامپیوتر مقصد است که برنامه Server در حال گوش دادن به آن پورت می باشد. در واقع با این دستور یک سوکت بین Client و Server ساخته می شود. در خط شماره 9 توسط متد GetStream() شی client همان کانال ارتباطی که از آن صحبت کردیم را در دست گرفته و به شی netStream اختصاص می دهیم. حال می توان توسط متد های Write(…) و Read(…) شی netStream در این کانال اطلاعات را بنویسیم و یا از آن بخوانیم. برای ارسال اطلاعات در NetworkStream باید اطلاعات در قالب یک آرایه ای از نوع byte باشد، به همین منظور در خط شماره 10 یک آرایه از نوع byte تعریف کرده و توسط دستور Encoding.ASCII.GetBytes("Hello Server!") رشته Hello Server! را به صورت آرایه ای از بایت ها تبدیل می کنیم.
    در خط شماره 12 توسط متد Write(…) شی netStream اطلاعات را در کانال می نویسیم و در سمت مقابل برنامه Server می تواند توسط متد Read(…) اطلاعات را دریافت کند. پارامتر اول دستور Write(…) آرایه بایتی را مشخص می کند که قرار است اطلاعات آن ارسال شود، پارامتر دوم تعیین می کند که از کدام محل از آرایه شروع به ارسال اطلاعات کند، و پارامتر سوم تعیین کننده مقدار اطلاعاتی است که باید ارسال شود.
    همانطور که گفتیم برنامه Server متن ارسالی توسط Client را دریافت کرده و همان متن را دوباره به سمت Client ارسال می کند. در این برنامه برای دریافت متن ارسالی از سمت Server، در خطوط شماره 17 الی 26 از یک حلقه while استفاده می کنیم. زمانی که Server فرایند ارسال خود را به پایان رساند، مقدار بازگشتی از متد Read(…) در شرط داخل حلقه، مقدار صفر خواهد بود و مقدار برگشتی صفر به معنی اتمام فرایند ارسال از سمت Server می باشد. و در نهایت در خط شماره 29 اطلاعات دریافتی را از حالت کد شده به فرمت متنی تبدیل کرده و در خروجی نمایش می دهیم.

    در اتمام کار هر اتصال و ارتباط شبکه ای بایستی کلیه منابعی را که برای برقراری ارتباط اشغال کرده ایم آزاد کنیم و این کار توسط دستورات بلاک finally از برنامه صورت می گیرد.st1\:*{behavior:url(#ieooui) }/*/*]]>*/تشریح برنامه سرویس دهنده (TCPEchoServer)
    در نسخه Server از این برنامه از فضای نام System.Net.Sockets به منظور استفاده از کلاس های TcpListener، TcpClient و NetworkStream و همچنین به منظور مدیریت استثناء های SocketException استفاده شده است.
    توسط objectی از کلاس TcpListener برنامه Server می تواند به درخواست های اتصال ورودی TCP به Server گوش فرادهد. در هنگام تعریف شی از این کلاس می توان یک واسط محلی (یک کارت شبکه بر روی کامپیوتر Server) و یک شماره پورت را جهت گوش دادن Server به اتصال های ورودی مشخص کرده و توسط متد Start() از این کلاس می توان فرایند گوش دادن را آغاز کرد. بعد از این، توسط متد AcceptTcpClient() از کلاس TcpListener که خروجی آن از نوع کلاس TcpClient() می باشد می توان اتصال های ورودی از سمت سرویس گیرنده ها را دریافت کرد و در ادامه با استفاده از متد GetSteam() می توان به کانال ارتباطی که بین سرویس گیرنده و سرویس دهنده ایجاد شده است دسترسی داشت و به ارسال و دریافت اطلاعات پرداخت.

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


    برنامه Server نیز همانطور که گفته شد یک Consol Application می باشد که در زیر به تحلیل تابع Main() برنامه می پردازیم

    کد:
     
    
    1 static void Main(string[] args)
    2 {
    3 byte[] byteBuffer = new byte[32]; // receive buffer
    4 TcpListener listener = null;
    5 try
    6 {
    7 // create a TcpListener to accept client connections
    8 listener = new TcpListener(IPAddress.Any, 8000);
    9 listener.Start();
    10 }
    11 // exit program, if server can not use port number 8000
    12 catch (Exception err)
    13 {
    14 Console.WriteLine(err.ToString());
    15 Environment.Exit(0);
    16 }
    17 int byteRcvd = 0; // received byte count
    18 // run forever, accepting and servicing connections
    19 for (; ; )
    20 {
    21 TcpClient client = null; // for each client connection
    22 NetworkStream netStream = null; // for each connection stream
    23 Console.WriteLine("Waiting for connections...");
    24 try
    25 {
    26 client = listener.AcceptTcpClient(); // get client connection
    27 netStream = client.GetStream(); // get connection stream
    28 Console.WriteLine("Handling client...");
    29 // receive until client closes connection,
    30 // indicated by 0 return value
    31 int totalByteRcvd = 0;
    32 while ((byteRcvd = netStream.Read(byteBuffer, totalByteRcvd,
    33 byteBuffer.Length - totalByteRcvd)) > 0)
    34 {
    35 netStream.Write(byteBuffer, 0, byteRcvd);
    36 totalByteRcvd += byteRcvd;
    37 } // end while
    38 Console.WriteLine(totalByteRcvd +
    39 " bytes received from client >>> " +
    40 Encoding.ASCII.GetString(byteBuffer) +
    41 "\r\n");
    42 // close the stream and socket. we are done with this client!
    43 netStream.Close();
    44 client.Close();
    45 } // end try
    46 catch (Exception err)
    47 {
    48 Console.WriteLine(err.ToString());
    49 netStream.Close();
    50 } // end catch
    51 } // end for(;;)
    52 } // end main method
    در خط شماره 3 یک آرایه از نوع بایت و با اندازه 32 تعریف می شود. برنامه Server از این آرایه برای ذخیره داده هایی که از Client دریافت می شود استفاده می کند. در خط شماره 4 تعریف اولیه شی listener از نوع کلاس TcpListener صورت می گیرد و در ادامه در خط شماره 8 از کد برنامه تعریف کامل این object انجام می شود. همانطور که مشاهده می شود سازنده کلاس TcpListener دو پارامتر دریافت می کند که پارامتر اول مشخص می کند که کامپیوتر Server به کدام کارت شبکه روی خودش گوش دهد. به عنوان مثال اگر دو عدد کارت شبکه با IPهای مختلف روی کامپیوتر Server وجود داشته باشد، با وارد کردن IP همان کارت شبکه مشخص می کنید که برنامه Server باید به درخواست های اتصال از کدام کارت شبکه توجه کند. و اما پارامتر دوم، این پارامتر مشخص می کند که برنامه Server به کدام پورت گوش دهد. این شماره پورت همان شماره پورتی است که برنامه Client باید شماره آنرا بداند تا بتواند به برنامه Server متصل شده و ارسال و دریافت Data انجام دهد. توجه داشته باشید که با این دستور ما در واقع یک سوکت در سمت Server ایجاد کرده ایم. در ادامه و در خط شماره 9 توسط متد start() از کلاس TcpListener فرایند گوش دادن به سوکت ایجاد شده آغاز می شود.
    با مشاهده به کد برنامه ملاحضه می کنید که کل فرایند ساختن سوکت در سمت Server در خطوط 5 الی 16 از کد قرار دارد و توسط بلاک های try و catch خطاهای آن مدیریت می شود. سازنده TcpListener در صورت عدم موفقیت در ساخت سوکت استثناء های ArgumentNullException و ArgumentOutOfRangeException را صادر می کند. در واقع برنامه Server اگر نتواند سوکت خود را ایجاد کند دیگر نمی تواند به عنوان یک Server برای Clientها وظیفه خود را انجام دهد، به همین خاطر در بلوک catch و در صورت عدم موفقیت Server در ساختن سوکت توسط دستور Environment.Exit(0) به اجرای برنامه خاتمه داده می شود.
    همانطور که مشاهده می شود کلیه کدهای خطوط 19 الی 51 درون یک حلقه بی پایان قرار دارند. توسط این دستورات متن ارسالی از Client دریافت شده و همان متن دوباره برای Client ارسال می گردد. این دستورات از این جهت در یک حلقه بینهایت قرار گرفته اند که برنامه Server بتواند تقاضاهای اتصال از چندین Client را مدیریت کند. یعنی تا وقتی که برنامه Server در حال اجرا است، با خاتمه یک برنامه Client می توانید باز هم برنامه Client دیگری را اجرا کنید. دقت داشته باشید که این برنامه در یک لحضه فقط می تواند به یک Client سرویس دهد.
    در خطوط 21 و 22 یک شی از نوع TcpClient برای مدیریت هر اتصال دریافتی و یک شی NetworkStream برای در دست گرفتن Stream و یا همان کانال ارتباطی بین Client و Server تعریف شده است. در صورتی که تقاضایی از سمت Clientی برای اتصال به Server وجود نداشته باشد اجرای برنامه Server با رسیدن به خط شماره 26 و در واقع با رسیدن به دستور AcceptTcpClient() متوقف می شود، که به این عمل بلوکه شدن گویند. متد AcceptTcpClient() با دریافت اولین تقاضای اتصال از سمت Client از حالت بلوکه خارج شده و در خط شماره 27 توسط متد GetStream() از شی client کانال ارتباطی بین Server و Client برقرار می گردد و به شی netStream تخصیص داده می شود. از این پس می توان کلیه اعمال ارسال و دریافت را توسط شی netStream انجام داد. در خطوط 32 الی 37 توسط یک حلقه while متن ارسالی از سمت Client توسط متد Read(…) از شی netStream دریافت شده و توسط متد Write(…) دوباره به Client ارسال می گردد. در خطوط 43 و 44 توسط متد Close() شی های client و netStream ، ارتباط و اتصال بین Server و Client قطع می گردد و دوباره دستورات حلقه for(; ; ) از ابتدا اجرا می شوند. یعنی در این حالت چنانچه Client دیگری منتظر اتصال بوده باشد، به همان ترتیب به آن پاسخ داده می شود و اگر تقاضایی نباشد دوباره Server به حالت بلوکه می رود.
    اخرین ویرایش توسط sara.NET : 16-07-2009 at 10:40 PM

  6. کاربرانی که برای این مطلب مفید از sara.NET تشکر کرده اند:


  7. #5
    2,112 امتیاز ، سطح 10
    66% کامل شده  امتیاز لازم برای سطع بعدی 138
    0% فعالیت
    دستاورد ها:
    1 year registered1000 Experience Points
    نماد dare_khamosh
    تاريخ عضويت
    Jul 2009
    پست
    1
    گيپا
    630
    پس انداز
    0
    امتیاز
    2,112
    سطح
    10
    تشكرها
    1
    0 بار در 0 پست از اين كاربر تشكر شده


    به نظر شما این پست مفید است؟ بله | خیر

    پیش فرض

    به جز لینک اولی بقیه لینک ها خرابن
    چرا؟
    تو این قربت دلا خونه، کسی عاشق نمی مونه، دیگه تو قصه ها اسم از وفا نیست
    بلا از آسمون اومد، بلای ناگهون اومد، دیگه تو حرفامون اسم از "خدا" نیست

  8. #6
    sara.NET
    Guest


    به نظر شما این پست مفید است؟ بله | خیر

    پیش فرض

    وقتي لينك دادم سالم بود
    ظاهرا نويسنده فايل ها رو از هاستش پاك كرده
    از طريق منبع پيگيري كنيد

  9. #7
    1,975 امتیاز ، سطح 10
    32% کامل شده  امتیاز لازم برای سطع بعدی 275
    0% فعالیت
    دستاورد ها:
    1 year registered1000 Experience Points

    تاريخ عضويت
    Oct 2009
    پست
    1
    گيپا
    646
    پس انداز
    0
    امتیاز
    1,975
    سطح
    10
    تشكرها
    1
    3 بار در 1 پست از اين كاربر تشكر شده


    به نظر شما این پست مفید است؟ بله | خیر

    Thumbs up مرسيييييييييييي

    سارا جان خيلي خيلي ممنونم واسه مقاله اي كه گذاشتيي...
    ( من عضو تازه واردم...

  10. 3 نفر از a.raki برای این مطلب مفید تشکر کرده اند:


  11. #8
    كاربر تازه وارد
    2,179 امتیاز ، سطح 10
    83% کامل شده  امتیاز لازم برای سطع بعدی 71
    0% فعالیت
    دستاورد ها:
    1 year registered1000 Experience Points

    تاريخ عضويت
    Aug 2009
    پست
    24
    گيپا
    1,144
    پس انداز
    0
    امتیاز
    2,179
    سطح
    10
    تشكرها
    0
    3 بار در 3 پست از اين كاربر تشكر شده


    به نظر شما این پست مفید است؟ بله | خیر

    پیش فرض

    انگار سارا خانم socket کار هست.
    چند عدد سوال :
    در برنامه ای که با همین Tcplistener و Tcpclient نوشته شده اقدام به ارسال فایل می پردازیم.
    محیطی درآن تست صورت گرفت LAN بود که جواب میده.
    اگر همین برنامه همین کار رو بخواهد در سطح اینترنت انجام بده ،
    اندازه بافر کردن اطلاعات مهم است؟اگر هست چقدر مناسب هست؟
    امکان ازدست رفتن اطلاعات وجود داره ؟
    آیا اندازه بافر باید متناسب با سرعت اینترنت باشه؟

  12. #9
    1,964 امتیاز ، سطح 10
    29% کامل شده  امتیاز لازم برای سطع بعدی 286
    0% فعالیت
    دستاورد ها:
    1 year registered1000 Experience Points

    تاريخ عضويت
    Oct 2009
    پست
    1
    گيپا
    691
    پس انداز
    0
    امتیاز
    1,964
    سطح
    10
    تشكرها
    0
    0 بار در 0 پست از اين كاربر تشكر شده


    به نظر شما این پست مفید است؟ بله | خیر

    پیش فرض

    Salam.
    Khob bud yadi ham az manba mataleb mikardin!!!
    [ nevisande ]

  13. #10
    كاربر تازه وارد
    2,179 امتیاز ، سطح 10
    83% کامل شده  امتیاز لازم برای سطع بعدی 71
    0% فعالیت
    دستاورد ها:
    1 year registered1000 Experience Points

    تاريخ عضويت
    Aug 2009
    پست
    24
    گيپا
    1,144
    پس انداز
    0
    امتیاز
    2,179
    سطح
    10
    تشكرها
    0
    3 بار در 3 پست از اين كاربر تشكر شده


    به نظر شما این پست مفید است؟ بله | خیر

    پیش فرض

    آگهی تبلیغات
    کسی جواب مارو نمیده ؟

+ پاسخ به مبحث
صفحه 1 از 2 12 آخرآخر

بازدید کنندگانی که از طریق جستجو کلمات ذیل به انجمنهای گیگاپارس آمده اند:

سوکت پروگرمینگ چیست

سوکت پروگرمینگ

سوکت پروگرامینگ

سوکت پروگرمینگ در جاوا

سوکت پروگرمینگ در C#

آموزش سوکت پروگرمینگ

سوکت پروگرمینگ در دلفی

سوکت پروگرامینگ چیست؟سوکت پروگرمینگ چیست؟سوکت پروگرامینگ چیست آموزش سوکت پروگرمینگ در c#سوكت پروگرامينگآموزش سوکت پروگرامینگبرنامه سوکت پروگرامینگIPHostEntry چیستدانلود کتاب سوکت پروگرامینگآموزش سوکت پروگرمینگ در جاواآموزش networkstream c#دانلود کتاب سوکت پروگرمینگکتاب آموزش سوکت پروگرمینگسوكت پروگرمينگ چيست؟دستورات برنامه نویسی سوکتآموزش سوکت پروگرامینگ دانلوددانلود کتاب سوکت پروگرامینگ فارسیسوكت پروگرمينگ چيست
SEO Blog

اطلاعات این مبحث

Users Browsing this Thread

در حال حاضر 1 کاربر در حال دیدن این مبحث می باشند، (0کاربر عضو و 1 کاربر مهمان)

تگهای این مبحث

قانون های ارسال نوشته

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts