گام 1 - نحوه اجرا همزمان دو پروژه در Microsoft Visual Studio

نحوه اجرا  همزمان دو پروژه در Microsoft Visual Studio

آموزش نحوه اجرا همزمان دو پروژه در Microsoft Visual Studio

در ابتدا فایل Server_Net.sln  را از طریق نرم افزار Microsoft Visual Studio اجرا کنید.

نحوه اجرا  همزمان دو پروژه در Microsoft Visual Studio

حالا می خواهیم Client.sln را به ‘Solution ‘Server_Net اضافه کنیم.

برای این کار بر روی ‘Solution ‘Server_Net کلیک راست می کنیم. از منو Add گزینه Existing Project را انتخاب می کنیم.

نحوه اجرا  همزمان دو پروژه در Microsoft Visual Studio

وارد پوشه Client_Net می شویم و دوباره وارد پوشه Client_Net می شویم. حالا آیکن Client_Net.csproj را انتخاب می کنیم.

نحوه اجرا  همزمان دو پروژه در Microsoft Visual Studio

می بینیم که Client_Net در زیر مجموعه ‘Solution ‘Server_Net قرار دارد.

نحوه اجرا  همزمان دو پروژه در Microsoft Visual Studio

حالا بر روی ‘Solution ‘Server_Net کلیک راست می کنیم و گزینه Properties را انتخاب می کنیم.

در پنجره باز شده ابتدا بر روی گزینه Multiple startup projects کلیک می کنیم و بعد از قسمت Action با کلیک کردن بر روی گزینه None آن را به Start تغییر می دهیم. بر روی دکمه OK کلیک می کنیم.

نحوه اجرا  همزمان دو پروژه در Microsoft Visual Studio

دکمه F5 را می زنیم تا برنامه با Debugging اجرا شود.

گام 2 - بررسی کد های سمت سرور

بررسی کد های سمت سرور

آموزش بررسی کد های سمت سرور

– در ابتدا کلمه using را می بینید. بعد از آن namespace مورد نظر آمده است. این خط کد برای استفاده کلاس ها، متد ها و … در namespace مورد نظر است. برای مثال using System.Net.Sockets برای استفاده از کلاس های Socket می باشد.

بررسی کد های سمت سرور

 

– در ابتدا می بینیم که یک namespace به نام Server_Net ایجاد شده است و کل کد های فرم مورد نظر ما در این namespace است.

– در خط بعدی منظور از کلمه کلیدی (keyword public) یعنی اینکه کلاس ما عمومی است و private (خصوصی) نیست در نتیجه موارد استفاده شده در این کلاس قابل استفاده در کلاس های دیگر می باشد. منظور از کلمه  کلیدی partial این است که کلاس frmMain می تواند در چند قسمت تعریف شود (مثال 1). بعد عبارت class frmMain: Form را می بینید که معرف کلاس مورد نظر و در نهایت فرم بودن کلاس را بیان  می کند.

 

­­- مثال 1:

public partial class Employee

}

    ()public void DoWork

 }

   {

{

 

public partial class Employee

}

()public void GoToLunch

   }

    {

{

همان طور که می بینید اگر بخواهیم از کلمه کلیدی partial استفاده کنیم باید  کلاس ما از نوع public باشد و بقیه خاصیت ها هم در این خط کد یکسان باشد. حالا کلاس Employee در دو بخش تعریف شده است.

– ()InitializeComponent این متد برای پشتیبانی طراح است. آن را تغییر ندهید.

– دو سوکت با نام های handler و listner تعریف کرده ایم. برنامه نویسی سوکت راهی برای ارتباط بین دو گره (node) در شبکه برای تبادل اطلاعات می باشد. یک سوکت یا گره (node) به یک پرت در IP تعیین شده گوش می دهد. در همین حین سوکت مقابل هم یک ارتباط را شکل می دهد.

– یک IPHostEntry به نام ipHostInfo ایجاد می کنیم که برای بدست آوردن اطلاعات آدرس هاست است.

– یک IPAddress  تعریف کردیم که برای آماده کردن یک (Internet Protocol ip) است.

– یک IPEndpoint تعریف کرده ایم. IPEndpoint برای ارائه یک نقطه نهایی (Endpoint) شبکه متشکل از یک آدرس آی پی و شماره پرت است. منظور Endpoint سیستمی است که اطلاعات قرار است به آن فرستاده شود.

– یک متغییر به نام maxClient از نوع int که const است تعریف کردیم. int یعنی متغییر ما از نوع اعداد صحیح است و const هم یعنی در صورتی که تغییر در متغییر ما صورت بگیرد (مثلا اضافه یا کم شود)، این تغییر در طول برنامه ثبت خواهد شد. این متغییر بیان گر حداکثر کلاینتی است که سرور پشتیبانی می کند.

– دو ترد ایجاد کرده ایم. یک ترد (thread) یک مسیر اجرای مستقل است، قادر به اجرای همزمان با ترد های دیگر است.

– یک string تعریف کرده ایم. رشته یا همان string برای دخیره نوشته ها استفاده می شوند.

– یک آرایه از نوع بایت ایجاد کرده ایم. هر آرایه می تواند عنصر هایی از یک نوع را ذخیره کند. به دلیل اینکه داده ها به صورت بایت (byte) فرستاده و دریافت می شوند ما نوع آرایه را بایت در نظر گرفتیم.

– به نوع delegate می رسیم.

در این خط ما یک delegate برای متد setDisplay تعریف می کنیم. کار delegate این است که متد setDisplay را encapsulate می کند. encapsulate کردن بدین معنی است که یک گروه از خواص (properties)، متد ها و دیگر اعضا مرتبط را به عنوان یک واحد یا شی، مورد بررسی قرار می گیرد. با متد setDisplay و EnableTrue در ادامه مطلب آشنا می شوید.

– متغییر از نوع bool یک مقدار true (یا 1) یا false (یا 0) بر می گرداند. مثلا در یک متد اگر عدد x اعشاری باشد مقدار 1 و اگر عدد صحیح باشد مقدار 0 را بر می گرداند.

– کلمه کلیدی void مشخص می کند که متد مورد نظر مقداری را برنمی گرداند.

نکته: متد (method) و تابع (function) هر دو یک یکی هستند فقط اسم های شان در برنامه های مختلف متفاوت است.

بررسی کد های سمت سرور

تعریف متد connect

– خب حالا به قسمت تعریف متد connect می رسیم. عبارت try-catch متشکل از یک بلوک try است که به دنبال آن یک یا چند عبارت catch می آید که کد هایی را برای استثنا های مختلف (در صورت عدم اجرای صحیح try) مشخص می کند.

– در ابتدا شما می بیند که عبارت Waiting for Connect a Client… را در متد btnConnectText قرار داده ایم. ایجاد این متد را در ادامه توضیح خواهیم داد. کار این متد این است که وقتی برنامه اجرا می شود این نوشته، متن دکمه btnConnect باشد.

– با دستور ;(()Dns.Resolve(Dns.GetHostName اطلاعات مربوط به هاست را در شیء ipHostInfo می ریزیم. از کلاس DNS متد Resolve را اجرا می کنیم به این صورت که این متد توسط نام هاست (یا آی پی آدرس) یک نمونه IpHostEntry ایجاد می کند. ()DNS.GetHostName برای بدست آوردن نام هاست می باشد.

– ;[ipAdd = ipHostInfo.AddressList[0 – در این خط کد، شما اطلاعات مربوط به آدرس هاست را در ipAdd می ریزید. [AddressList[0 در یک آرایه لیستی از آی پی آدرس ها را که مربوط به هاست می باشند تنظیم و یا دریافت می کند.

– ;(localEndPoint = new IPEndPoint(ipAdd, 1369 – با این خط کد می توانید یک IPEndPoint با آی پی مورد نظر (ipAdd) و شماره پرت تان  بسازید.

– ;(listner.Bind(localEndPoint – در این  خط کد ما سوکت listner را به localEndPoint مقید می کنیم.

– ;(listner.Listen(maxClient در این خط کد ما ماکسیمم تعداد شنود ها را مشخص می کنیم. در واقع از متد Listen در سوکت listner استفاده می کنیم.

– ;(()th1 = new Thread(new ThreadStart(AcceptStart – با این خط کد در th1 متد AcceptStart را که پایین تر ایجاد کرده ایم قرار داده ایم. بعد در خط بعدی th1 را ایجاد کرده ایم.

– در قسمت catch هم ارور (error) مربوطه نشان داده می شود. MessageBox.Show ارور مربوطه را در یک پنجره نشان می دهد. در واقع  در ابتدا یک متغییر (ex) از نوع متد Exception ایجاد می کنیم و بعد متن این ارور  (ex.Message) را در یک پنجره نشان داده می دهیم. کار متد Exception به معنی استثناء این است که ارور مربوطه را ارائه می دهد.

بررسی کد های سمت سرور

متد AcceptStart

– خب این متد AcceptStart که در متد Connect استفاده کردیم هم از یک عبارت try-catch استفاده می کند.

– ما سوکت handler را برابر با پذیرش سوکت listner قرار دادیم.

– در ترد th2 متد DataReceive (این متد در ادامه توضیح داده می شود) را قرار داده ایم.

– در خط بعدی th2 اجرا می شود.

– در خط بعدی توسط متد btnConnectText (این متد در ادامه توضیح داده می شود) نوشته مورد نظر بر روی دکمه BtnConnect نمایش داده می شود.

– در خط بعدی متد EnableAfterConnect (این متد در ادامه توضیح داده می شود)که از نوع bool (یعنی مقادیر True یا False را می پذیرد) می باشد وظیفه فعال سازی قسمت هایی را بعد از Connect، در برنامه چت ما دارد.

– در خط بعدی کد مربوطه یک صدا را جهت اعلام آمادگی برنامه برای چت پخش می کند.

– در خط بعدی هم که به صورت کامنت آمده است، بدست آوردن آی پی کلاینت ایجاد شده است. این خط به دلیل اینکه کامنت است در برنامه ما اجرا نمی شود. دستورات کامنت با علامت // مشخص می شوند.

– قسمت catch هم مانند قسمت catch در متد Connect عمل می کند.

بررسی کد های سمت سرور

متد DataReceive

– در اینجا ما متد DataReceive را که در متد AcceptStart استفاده شده است مورد بررسی قرار می دهیم.

– این متد هم از یک try-catch استفاده کرده است.

– در ابتدا یک آرایه به نام bytes از نوع byte و به مقدار 1000 ایجاد کرده ایم. و بعد یک int تعریف کرده ایم.

– دو حلقه while با شرط درست بودن شان ایجاد کرده ایم. در حلقه while دومی اگر حلقه if درست نباشد (یا دستور break اجرا شود)، پس while ها هم false می شوند و در نتیجه از هر دو حلقه while بیرون می آییم و دستور بعدی اجرا می شود.

– درون while دوم در ابتدا در byteRec اطلاعاتی که بر حسب بایت از سوکتhandler دریافت کرده ایم را قرار می دهیم.

– یک حلقه if ایجاد کرده و درون آن data ای که در ابتدا به فرمت string تعریف کرده بودیم را برابر با تبدیل byteRec به String قرار می دهیم. بعد از این مرحله دستور break انجام می پذیرد و هر دو حلقه while، flase می شوند و در نتیجه دستور بعدی که ;(FillLstMsg(data است اجرا می شود و با این دستور data در LstMsg نمایش داده می شود.

– عبارت catch هم به صورت قبل نوشته می شود.

بررسی کد های سمت سرور

دکمه btnConnect

– به طور قراردادی در Visual Studio اگر نام دکمه ای  btnConnect باشد شما با قرار دادن یک مقدار  string در btnConnectText می توانید نام دکمه مورد نظر را تغییر دهید. برای مثال: “btnConnectText = “Connect button is here.

– برای تغییر متن دکمه btnConnect، از متد btnConnectText() که داراری ورودی string btnText می باشد استفاده کرده ایم.

– از یک حلقه if else استفاده کرده ایم که شرط را صحیح بودن وجود دکمه btnConnect به عنوان InvokeRequired (دکمه btnConnect را در شیء invoke فراخوانی و الزام آور می کند) قرار داده ایم.

– در داخل حلقه if در ابتدا یک setDisplay به نام d ایجاد کرده ایم که یک delegate است (در ابتدا مفهوم delegate گفته شده است) و بعد آن را مساوی با تعیین ظاهر (در اینجا نوشته) دکمه btnConnect (یعنی btnConnectText) قرار داده ایم.

– در خط بعدی هم منظور از شیء this، کلاس frmMain است که در آن با شیء Invoke (که کارش اجرای یک delegate مشخص است)، btnTxt را به جای btnConnectText قرار می دهیم. (در واقع این شیء Invoke، btnConnect.InvokeRequired را فراخوانی می کند)

– در قسمت else هم مستقیما بدون استفاده از متد setDisplay، btnConnect.Text را مساوی با btnText قرار می گیرد.

بررسی کد های سمت سرور

متد EnableAfterConnect

– در متد EnableAfterConnect هدف، فعال کردن سه قسمت ذکر شده برای زمان بعد از اتصال کلاینت به سرور است.

– برای فهمیدن این قسمت کافی است قسمت قبلی را خوب مطالعه کنید.

بررسی کد های سمت سرور

– در این متد هم اضافه شدن پیام دریافتی از سوی کلاینت مورد انجام قرار گرفته است.

– مطالب مانند متد btnConnectText است. با مطالعه متد btnConnectText، شما قادر خواهید بود که این متد را درک کنید.

بررسی کد های سمت سرور

آی پی سرور و نام سرور در لیبل ها

– این قسمت برای نشان دادن آی پی سرور و نام سرور در لیبل ها است.

– با دستور ;(()Dns.Resolve(Dns.GetHostName اطلاعات مربوط به هاست را در شیء myHostInfo می ریزیم. از کلاس DNS متد Resolve را اجرا می کنیم به این صورت که این متد توسط نام هاست (یا آی پی آدرس) یک نمونه IpHostEntry ایجاد می کند. متد ()DNS.GetHostName برای بدست آوردن نام هاست می باشد.

– در خط بعد شما با بدست آوردن آدرس آی پی هاست و تبدیل کردن اش به string، قادر خواهید بود تا آن را در لیبل lblName نشان دهید.

– در خط بعدی هم نام هاست در لیبل lblName نمایش داده خواهد شد.

– در خط بعدی برای سوکت listner تنظیماتی انجام داده ایم. توجه کنید به دلیل اینکه نوع پروتکل ما TCP (اتصال گرا) است نوع سوکت ما هم stream می شود. اگر نوع پروتکل UDP (بدون اتصال) بود، نوع سوکت هم Dgram می شد.

– در سه خط بعدی هم سه قسمت (component) را غیر فعال کرده ایم تا زمانیکه عملیات connect اتفاق افتاد، قسمت ها فعال شوند که توسط متد EnableAfterConnect صورت می گیرد.

بررسی کد های سمت سرور

خروج از برنامه

– دکمه btnExit برای خروج از برنامه می باشد.

– قبل از عبارت try-catch دستوری برای لغو کردن رویداد ها می باشد که از نوع Boolean می باشد.

– ;(handler.Shutdown(SocketShutdown.Both در این خط کد هم سوکت handler پایان می پذیرد. و منظور از Both هم Sending و هم Receiving است.

– در خط بعدی همین اتفاق برای سوکت listner می افتد.

– در دو خط بعدی هم ترد های th1 و th2 پایان می پذیرند.

– ;(Environment.Exit(0 – با این خط کد هم محیط برنامه بسته می شود.

گام 3 - ادامه بررسی کد های سمت سرور

ادامه بررسی کد های سمت سرور

آموزش ادامه بررسی کد های سمت سرور

(private void frmMain_FormClosing(object sender, FormClosingEventArgs e

        }

            ;e.Cancel = true

            try

          }

                ;(handler.Shutdown(SocketShutdown.Both

                ;(listner.Shutdown(SocketShutdown.Both

               ;()th1.Abort

                ;()th2.Abort

           {

            catch

           }

       {

            ;(Environment.Exit(0

– در این قسمت در صورتی که دکمه خروج از برنامه را بزنید این دستورات اجرا می شوند.

– در مرحله اول باید بر روی FormColsing یک دابل کلیک کنید تا بتوانید کد های بالا را وارد کنید.

– قبل از عبارت try-catch دستوری برای لغو کردن رویداد ها می باشد که از نوع Boolean می باشد.

– ;(handler.Shutdown(SocketShutdown.Both در این خط کد هم سوکت handler پایان می پذیرد. و منظور از Both هم Sending و هم Receiving است.

– در خط بعدی همین اتفاق برای سوکت listner می افتد.

– در دو خط بعدی هم ترد های th1 و th2 پایان می پذیرند.

– ;(Environment.Exit(0 – با این خط کد هم محیط برنامه بسته می شود.

ادامه بررسی کد های سمت سرور

– دکمه btnSendMsg وظیفه فرستادن متن نوشته شده در txtMsg را دارد.

– از یک try-catch تشکیل شده است.

– در قسمت try از یک if با شرط خالی نبودن txtMsg استفاده شده است. در ابتدا آرایه msg توسط اطلاعاتی که از txtMsg می گیرد پر می شود. در خط بعدی سوکت handler آرایه msg را ارسال می کند. در خط بعدی هم اطلاعاتی که فرستاده اید در lstMsg تان نمایش داده می شود. در خط بعدی هم یک دستور برای خالی کردن متنی است که در txtMsg نوشتید.

– قسمت catch هم به صورت قبل تعریف می شود.

ادامه بررسی کد های سمت سرور

– در متد txtMsg_KeyPress کاراکتر متناظر با دکمه فشار داده شده گرفته یا تنظیم می شود.

گام 4 - بررسی کد های سمت کلاینت

بررسی کد های سمت کلاینت

– برنامه نویسی مانند یادگیری زبان است. در مرحله اول گوش کردید و حالا زمان صحبت کردن است. به عنوان تمرین خودتان کدهای سمت کلاینت را بررسی کنید.

گام 5 - منبع کد ها

منبع کدها

/سورس-کد-پروژه-چت-بین-چند-کامپیوتر/www.sourceiran.com/programing/c

 

با آرزوی موفقیت