تبلیغات

نسل باران

|

بانک شماره و موبایل popup window

قالب های حرفه ای وردپرس

|

پلاگین وردپرس popup window

وب سایت دانشجویان کارشناسی و ارشد کامپیوتر خرم آباد - سوکت های آسنکرون
نسل باران
وب سایت دانشجویان کارشناسی و ارشد کامپیوتر خرم آباد
امام علی (ع) می فرمایند: « زکات العلم نشرهُ» زکات علم نشر آن است.
به سایت ما خوش آمدید


کدهایی که تا به اینجا دیدیم برای ایجاد سوکت های همگام یا سنکرون بوده است. این سوکت ها در برنامه های ویندوز و کلا سیستم های مالتی تسک کاربردی ندارند. چرا که بالفرض در زمانی از متد accept استفاده نموده ایم، در این حالت برنامه تا رسیدن یک سوکت به آن قفل شده و قادر به انجام کاری نیست.
در سوکت های آسنکرون از متدهای آسنکرون برای گوش دادن ، ارسال ، دریافت و ... استفاده میکنیم.در این مقاله ، یک برنامه سمنت سرور به صورت آسنکرون طراحی میکنیم که قادر به گوش دادن به یک کلاینت است.
نکته : قبل از ادامه ، آشنایی با delegate ها الزامی است. میتوانید delegate ها را در مقاله مربوطه مشاهده فرمایید ولی اگر بخواهیم در یک جمله Delegate ها را تعریف کنیم میتوانیم بگوییم :
delegate در حقیقت چیزی نیست جز اشاره گر به تایع !
در سوکت های آسنکرون ، از delegate ای به نام AsyncCallback استفاده میکنیم. این Delegate به تابعی اشاره میکند که تنها یک آرگومان ورودی از نوع IAsyncResult دارد. متدهایی که به صورت آسنکرون کار میکنند ، اطلاعات مورد نظر خود را به صورت یک شی از این توع به تابع مورد نظر خود ارسال میکنند.
نکته : متدهای آسنکرون با پیشوندهای Begin و End شروع میگردند.
برای نوشتن برنامه ، ابتدا یک سوکت تعریف میکنیم که عمل گوش دادن را انجام دهد :

Socket Mainlistener = new
Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);

سپس عملیات معمول را بر روی سوکت انجام میدهیم :

IPEndPoint server = new IPEndPoint(IPAddress.Any, 1800);
Mainlistener.Bind(server);

همانگونه که میبینید ، در این برنامه سوکت مورد نظر ما به پورت 1800 گوش میدهد.

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

AsyncCallback callBackMethod = new
AsyncCallback(AcceptCallback);

اکنون باید سوکت تعریف شده به صورت غیر همگام ( آسنکرون) شروع به گوش دادن به پورت کند :

Mainlistener.Listen(4);
Mainlistener.BeginAccept(AcceptCallback,Mainlistener);

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

private void AcceptCallback(IAsyncResult ar)
{
...
{

در این تابع ، آرگومانی از نوع IAsyncResult وجود دارد. این آرگومان اطلاعات وضعیت فراخوان تابع آسنکرون که در اینجا یک سوکت است را نگهداری میکند. ابتدا این اطلاعات را استخراج میکنیم :
Socket temp = ((Socket)ar.AsyncState);
سپس به گوش دادن برای پذیرفتن کلاینت خاتمه میدهیم چرا که اکنون دیگر کلاینت مورد نظر به سرور کانکت شده و آماده برای ارسال اطلاعات است :
Socket worker = temp.EndAccept(ar);
نکته : دو دستور قبل را میتوانستیم در قالب یک دستور و به این شکل بنویسیم :
Socket temp = ((Socket)ar.AsyncState).EndAccept(ar);
بسیار خوب، اکنون که ارتباط کلاینت با برنامه ما برقرار گردیده است ، کافی است تا به صورت آسنکرون به دریافت اطلاعات مشغول شویم. باز هم مانند قسمت قبل، از متدهای آسنکرون استفاده کرده و تابعی تعیرف میکنیم که به محض دریافت اطلاعات فراخوانی گردیده و عملیات مورد نظر ما را انجام دهد.
نکته ای که بسیار حائز اهمیت است این که بایستی از یک بافر برای ذخیره اطلاعات دریافتی استافده کنیم. این بافر که در حقیقت آرایه ای از بایتها است به صورت یک آرایه سراسری تعریف میکنیم :
byte[] buffer = new byte[1024];
نکته : با توجه به این که در این برنامه صرفا یا یک کلاینت کار میکنیم ، سراسری بودن بافر مشکلی ایجاد نمیکند، اما چنانچه قصد داشتیم با چند کلاینت کار کنیم برای هریک میبایست بافر مخصوص به خودش را تعریف میکردیم که اصولا پیاده سازی آن برنامه به گونه ای دیگر خواهد بود که در مقالات آتی مورد بررسی قرار خواهد گرفت.
برای دریافت اطلاعات به صورت آسنکرون ، از متد BeginReceive استفاده میکنیم. البته بایستی بافر، اندیس اولیه ای که میخواهیم بافر از آنجا پر شود و همچنین اندیس حد نهایی بافر را مشخص کنیم.

AsyncCallback ReceiveMethod = new AsyncCallback(ReceiveCallBack);
worker.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None,new
ReceiveMethod, worker);

پس تا اینجا ، متد AcceptCallback به این صورت است :

private void AcceptCallback(IAsyncResult ar)
{
Socket temp = ((Socket)ar.AsyncState);
Socket worker = temp.EndAccept(ar);
AsyncCallback ReceiveMethod = new AsyncCallback(ReceiveCallBack);
worker.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None,new
ReceiveMethod, worker);
}

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

private void ReceiveCallBack(IAsyncResult ar)
{
...
{

درون این متد ، ابتدا اطلاعات وصعیت را بدست می آوریم :
Socket worker = ((Socket)ar.AsyncState);
سپس به گوش دادن به صورت موقت خاتمه میدهیم تا بتوانیم داده های فعلی را پردازش کنیم. این کار را با متد EndReceive انجام میدهیم . مقدار بازگشتی این متد تعداد بایتهای دریافت شده میباشد :
int bytesReceived = worker.EndReceive(ar);
حال میبایست اطلاعات دریافت شده که به صورت آرایه ای بایتها درون بافر هستند را پردازش کرده و جهت نمایش به رشته (string) تبدیل کنیم :
string str = System.Text.UTF8Encoding.UTF8.GetString(buffer);
حال میتوانیم اطلاعات را نمایش دهیم . نکته مهمی که اینجا وجود دارد این است که در برنامه نویسی به شیوه آسنکرون دیگر نمیتوانیم به صورت عادی این رشته را به یک TextBox و یا کلا یک کنترل بفرستیم . دلیل این امر این است که تنها آن thread ای که کنترل مورد نظر را در ابتدای برنامه ایجاد کرده است میتواند با کنترل کار کرده و اطلاعات لازم را به آن بفرستد . پس کاری که انجام میدهیم استفاده از یک متد کمکی است که ابتدا thread ایجاد کننده کنترل را پیدا کرده و سپس کار مورد نظر را با استفاده از آن انجام میدهد . در این مثال نام این تابع را ShowInfo قرار داده ایم و تنها یک پارامتر از نوع رشته ای به آن ارسال میکنیم . البته فعلا دانستن جزئیات این متد چندان لازم نیست :

delegate void ShowInfoCallback(string text);
private void ShowInfo(string text)
{
if (this.txtMain.InvokeRequired)
{
ShowInfoCallback d = new ShowInfoCallback(ShowInfo);
this.Invoke(d, new object[] { text });
{
else
{
txtMain.Text+=text+"\n";
}
}

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

AsyncCallback ReceiveMethod = new AsyncCallback(ReceiveCallBack);
worker.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None,
ReceiveMethod, worker);

پس متد ReceiveCallBack به این صورت است :

private void ReceiveCallBack(IAsyncResult ar)
{
Socket worker = ((Socket)ar.AsyncState);
int bytesReceived = worker.EndReceive(ar);
string str = System.Text.UTF8Encoding.UTF8.GetString(buffer);
ShowInfo(str);
AsyncCallback ReceiveMethod = new AsyncCallback(ReceiveCallBack);
worker.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None,
ReceiveMethod, worker);
}

متن کامل برنامه :

byte[] buffer = new byte[1024];
public Form1()
{
InitializeComponent();
Socket Mainlistener = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPEndPoint server = new IPEndPoint(IPAddress.Any, 1800);
Mainlistener.Bind(server);
AsyncCallback callBackMethod = new AsyncCallback(AcceptCallback);
Mainlistener.Listen(4);
Mainlistener.BeginAccept(AcceptCallback,Mainlistener);
}
private void AcceptCallback(IAsyncResult ar)
{
Socket temp = ((Socket)ar.AsyncState);
Socket worker = temp.EndAccept(ar);
AsyncCallback ReceiveMethod = new AsyncCallback(ReceiveCallBack);
worker.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveMethod, worker);
}
private void ReceiveCallBack(IAsyncResult ar)
{
Socket worker = ((Socket)ar.AsyncState);
int bytesReceived = worker.EndReceive(ar);
string str = System.Text.UTF8Encoding.UTF8.GetString(buffer);
ShowInfo(str);
AsyncCallback ReceiveMethod = new AsyncCallback(ReceiveCallBack);
worker.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveMethod, worker);
}
delegate void ShowInfoCallback(string text);
private void ShowInfo(string text)
{
if (this.txtMain.InvokeRequired)
{
ShowInfoCallback d = new ShowInfoCallback(ShowInfo);
this.Invoke(d, new object[] { text });
}
else
{
txtMain.Text+=text+"\n";
}
}

برای تست کردن برنامه میتوانیم از Telnet استفاده کنیم. Telnet یکی از امکانات ویندوز است که به کمک ان میتوان به یک آدرس IP و یک شماره پورت خاص وصل شده و به ارسال اطلاعات مشغول شویم. کافی است ایتدا برنامه را اجرا کرده و سپس در منوی RUN تایپ کنید :
telnet 127.0.0.1 1800
سپس در پنجره مشکی رنگ ظاهر شده ، شروع به تاپیک کردن کنید . آنچه شما تایپ میکنید، برای برنامه ارسال میگردد و میتوانید آن را مشاهد فرمایید .
نکته مهم این است که چنانچه برنامه TELNET را پیش از بستن برنامه سرور که نوشته ایم ببندید ، برنامه ما در یک loop می افتد و آخرین اطلاعات ارسال شده را به صورت مداوم تکرار میکند !!! البته این مشکل از برنامه ما نیست و به دلیل عملکرد برنامه Telnet این اتفاق می افتد. در مقاله بعدی یاد خواهیم گرفت که برنامه سمت کلاینت را نیز به صورت آسنکرون بنویسیم و بنابراین نیازی به Telnet نخواهیم داشت .



نوع مطلب : Socket Programming، برنامه نویسی، 
برچسب ها :
لینک های مرتبط :

1397/07/19 13:15

Nicely put, Appreciate it!
levitra 20 mg levitra 10 mg prezzo levitra prices levitra prices levitra 20mg levitra prices levitra online vardenafil generic levitra buy levitra generic
1397/07/7 02:10

Thanks, Lots of write ups!

5 mg cialis pharmacie en ligne safe dosage for cialis price cialis per pill overnight cialis tadalafil cialis reviews cialis dosage recommendations how much does a cialis cost enter site very cheap cialis cialis venta a domicilio buy cialis
1397/06/27 16:55

You said it nicely..
cialis 20mg prix en pharmacie cialis price in bangalore cialis canada on line cialis herbs cialis sale online tadalafil tablets cialis canadian drugs cialis lowest price cialis patentablauf in deutschland cialis canada on line
1397/06/15 05:40

Wonderful posts, Many thanks!
we recommend cialis info cost of cialis per pill cialis 20 mg cost cialis 20 mg cut in half cialis lowest price cialis 20 mg best price estudios de cialis genricos sublingual cialis online cialis canadian drugs canadian drugs generic cialis
1397/06/13 21:24

You mentioned it really well.
canada medications buy buy viagra online usa cialis canadian pharmacy canadianpharmacy buy vistagra usa canada medication pharmacy canadian pharmacy meds canada online pharmacies for men drugs for sale usa canadian rx
1397/06/13 05:02

You have made your position extremely nicely!!
can u buy viagra over the counter where can i get viagra prescription cheap viagra online usa get viagra online buy viagra with prescription buy viagra tesco buy levitra viagra safe place to buy viagra online uk best place to buy viagra buy viagra in pharmacy
1397/06/12 21:16

You reported this wonderfully.
no prescription cialis cheap cialis cuantos mg hay cialis generika in deutschland kaufen does cialis cause gout deutschland cialis online comprar cialis navarr cialis tablets for sale wow look it cialis mexico purchasing cialis on the internet cialis 05
1397/06/12 03:02

With thanks! An abundance of write ups.

achat cialis en europe we recommend cialis info order cialis from india fast cialis online cialis 5mg cialis bula cialis with 2 days delivery click here to buy cialis non 5 mg cialis generici order cialis from india
1397/06/11 13:37

Superb information. With thanks!
cialis from canada cialis tablets australia cialis kamagra levitra callus cialis 200 dollar savings card buy online cialis 5mg we choice free trial of cialis generic cialis review uk we choice cialis pfizer india viagra vs cialis vs levitra
1397/05/22 14:02

Regards, Fantastic stuff.
cialis dose 30mg american pharmacy cialis get cheap cialis ou acheter du cialis pas cher prescription doctor cialis generic cialis in vietnam price cialis wal mart pharmacy cialis per paypa cialis generico milano cialis prezzo in linea basso
1397/02/7 20:08

Amazing lots of wonderful information.
cialis pills price each we choice cialis uk cialis in sconto prix cialis once a da we like it cialis price order a sample of cialis bulk cialis cialis rckenschmerzen cialis ahumada tadalafil 10 mg
1397/02/4 07:02

This is nicely put! !
viagra in pharmacy how to order viagra buying viagra online legal best place to buy viagra how to purchase viagra ordering viagra online how can i buy viagra sildenafil buy online uk buy viagra online rx. blue pills
1397/01/3 20:37

Seriously a lot of useful advice!
tadalafil tablets cheap cialis viagra cialis levitra cialis 100 mg 30 tablet comprar cialis navarr we choice cialis uk cost of cialis cvs we choice free trial of cialis buy cialis online cheapest click now buy cialis brand
1396/12/28 02:10

Terrific content. Thanks a lot!
precios cialis peru pastillas cialis y alcoho fast cialis online online cialis brand cialis nl brand cialis nl cialis tadalafil cialis tablets cialis generika in deutschland kaufen chinese cialis 50 mg
1396/09/3 16:42
همسر من و من در اینجا از یک صفحه وب متفاوت فکر کردم
من هم ممکن است چیزهایی را ببینم. من دوست دارم آنچه را که می بینم اکنون دنبال کنم.
منتظر ماندگاری در مورد صفحه وب خود باشید.
1396/08/13 16:51
این واقعا یک بخش خوب و مفید از اطلاعات است. خوشحالم که شما به سادگی به اشتراک گذاشتهاید
این اطلاعات مفید با ما است. لطفا ما را به روز نگه دارید مثل این.
با تشکر برای به اشتراک گذاری
1396/05/17 02:14
Hi there, its good paragraph on the topic of media print, we all be familiar with media is a great source of data.
1396/05/9 21:18
I think that what you posted was actually very
reasonable. But, what about this? what if you were to write a killer headline?

I mean, I don't want to tell you how to run your website, but what if you added something that makes people want more?
I mean وب سایت دانشجویان کارشناسی و ارشد کامپیوتر خرم آباد
- سوکت های آسنکرون is kinda boring.
You could look at Yahoo's home page and note how they create
article headlines to grab viewers interested. You might try adding a video or a related pic or two to get readers excited about everything've got to say.
Just my opinion, it would bring your blog a little livelier.
1396/04/5 01:33
بسیار ریشه از خود نوشتن
در حالی که صدایی مناسب در آغاز آیا واقعا نشستن خوب با من پس از
برخی از زمان. جایی درون جملات شما موفق به
من مؤمن متاسفانه تنها برای بسیار
در حالی که کوتاه. من با این
حال مشکل خود را با جهش در مفروضات و شما ممکن است
را سادگی به پر کسانی که معافیت.
در این رویداد شما که می توانید انجام من را مطمئنا بود مجذوب.
1396/02/25 23:32
Hello There. I discovered your weblog the use of msn. This
is a very well written article. I'll be sure to bookmark it and come back to
read more of your useful information. Thanks for the post.

I'll definitely return.
1396/02/25 17:00
I do accept as true with all of the concepts you have
offered in your post. They are very convincing and will certainly work.
Nonetheless, the posts are too quick for starters.
May you please extend them a bit from next time?
Thank you for the post.
1396/01/31 22:58
Greetings! Very useful advice within this article! It is the little changes that will
make the greatest changes. Many thanks for sharing!
1396/01/23 17:35
Hi there to every one, because I am really keen of reading this blog's post to be updated daily.
It includes fastidious stuff.
 
لبخندناراحتچشمک
نیشخندبغلسوال
قلبخجالتزبان
ماچتعجبعصبانی
عینکشیطانگریه
خندهقهقههخداحافظ
سبزقهرهورا
دستگلتفکر


درباره وبلاگ


امام صادق(ع) می فرمایند: «اِنُّ لِکلِّ شیءٍ زکاةً و زکاةُ العِلمِ اَنْ یُعَلِّمَهُ اَهلَهُ» برای هر چیزی زکاتی است،و زکات علم آن است که آن را به اشخاص شایسته بیاموزید. (منبع: تحف.ص 364)

امام علی (ع) می فرمایند: « زکات العلم نشرهُ» زکات علم نشر آن است.

مدیر وبلاگ : s1390
مطالب اخیر
نویسندگان
صفحات جانبی
آمار وبلاگ
  • کل بازدید :
  • بازدید امروز :
  • بازدید دیروز :
  • بازدید این ماه :
  • بازدید ماه قبل :
  • تعداد نویسندگان :
  • تعداد کل پست ها :
  • آخرین بازدید :
  • آخرین بروز رسانی :
فرم تماس
نام و نام خانوادگی
آدرس ایمیل
امکانات دیگر
دریافت كد ختم صلوات
کلیه حقوق این وبلاگ برای وب سایت دانشجویان کارشناسی و ارشد کامپیوتر خرم آباد محفوظ است