PDA

View Full Version : سرویس دهی همزمان به کلاینتها



dr_csharp
پنج شنبه 03 مرداد 1387, 09:45 صبح
سلام
چطور میتونم با Socket Programming تحت پروتکل TCP چندین ارتباط Client-ServeR داشته باشم ( یک سرور به درخواست چند client پاسخ بده ) ؟

Xcalivorse
پنج شنبه 03 مرداد 1387, 10:17 صبح
باید از MultiThreading استفاده کنی. و Listener های خودت و در Thread ها به طور جدا گانه تعریف کنی.

dr_csharp
پنج شنبه 03 مرداد 1387, 11:10 صبح
باید از MultiThreading استفاده کنی. و Listener های خودت و در Thread ها به طور جدا گانه تعریف کنی.
ببینید :از اونجایی که تمام اطلاعات از یک Port دریافت میشن پس ما یک Listener بیشتر نمیتونیم داشته یاشیم که !؟ اگر نه،لطفا بیشتر توضیح بدین :لبخندساده:

raravaice
پنج شنبه 03 مرداد 1387, 11:20 صبح
شما مسئله رو داری از دید اشتباهی بررسی میکنی.

یک شنونده روی یه پورت درخواستهای مختلف رو میگیره شما بیا هر درخواست رو بفرست توی یه Thread برای پردازش و بزار شنونده به کارش ادامه بده.
توی دات نت کار بینهایت راحت شده.

موفق باشید

Xcalivorse
پنج شنبه 03 مرداد 1387, 20:49 عصر
البته به نظر من اگر از UDPClient استفاده کنید نتیجه بهتری میگیرید. چون TCPClient نیاز به ارتباط دوطرفه به صورت بی وقفه داره و برای این کار یه ذره خشک عمل میکنه. در صورتی که از UDP استفاده کنید به راحتی میتونید نتایج تقاضا ها رو با BroadCast IP به تمامی متقاضیان ارسال کنید. و کار به مراتب راحت تر میشه.
موفق باشید.

dr_csharp
شنبه 05 مرداد 1387, 09:22 صبح
شما مسئله رو داری از دید اشتباهی بررسی میکنی.

یک شنونده روی یه پورت درخواستهای مختلف رو میگیره شما بیا هر درخواست رو بفرست توی یه Thread برای پردازش و بزار شنونده به کارش ادامه بده.
توی دات نت کار بینهایت راحت شده.

موفق باشید
ممکنه لطفا کمی بیشتر توضیح بدین ؟

arashmidos2020
سه شنبه 06 مرداد 1388, 00:04 صبح
می شه این مساله رو بیشتر باز کنید.منم نمی دونم.
اگر می شه یک شمای کلی از multi Thread تو این برنامه رو بگید.خیلی ممنون

mah.yar
پنج شنبه 08 مرداد 1388, 09:24 صبح
ممکنه لطفا کمی بیشتر توضیح بدین ؟

من قبلا همچين برنامه اي رو نوشتم(البته نه اينكه ديگران بلد نباشن)
برنامه سمت كلاينت هيچ تغييري ايجاد نميشه.
هر وقت كلاينت درخواست connect رو ارسال كرد سرور اونو Accept ميكنه يعني اين دستور:

newserver = server.Accept();بعد با آبجكت سوكت به نام newserver‌ميتونيم اطلاعات رو بفرستيم يا بگيريم. تا اينجا درست!

خوب حالا براي اينكه بتونيم يه كلاينت ديگه رو ساپورت كنيم دوباره به خط گوش ميديم تا ببينيم درخواست اتصالي مياد يا نه.
با اين تفاسير ما نياز به آرايه اي از سوكت داريم براي accept كردن درخواست ها:

Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Socket[] newserver=new Socket[100];
.
.
.
newserver[i] = server.Accept();
نكته:بعد از هر بار accept‌ كردن مقدار i رو افزايش ميديم.
در نتيجه اگر كلاينت اولي درخواست اتصال بده [newserver[1 ايجاد ميشه و با دستور newserver[1].send ميتونيم با اين كلاينت اطلاعات رد و بدل كنيم و همچنين اگه كلاين دومي درخواست اتصال بده [newserver[2 ايجاد ميشه و به همين ترتيب ...
پس نيازي به گوش دادن به چندين پورت نيستو با همان يه پورت ميتونيم با چندين كلاينت ازتباط داشته باشيم چيزي شبيه 118 كه چندين نفر ميتونن به يه شماره متصل شن.

اينم سورس برنامه.

Sociant
جمعه 09 مرداد 1388, 23:54 عصر
همونطور که بعضی از دوستان اشاره کردند بهترین راه استفاده از multi threading هست.ساده ترین روش تو این زمینه اینه که برای رسیدگی به هر کلاینت یک thread ایجاد کنیم. اینجوری کلاینت ها مستقل از هم سرویس دهی میشن اما عیب این روش به هدر رفتن منابع سیستم در اثر بالا رفتن تعداد thread ها ست. واسه حل این مشکل از تکنیکی به نام Thread Pool استفاده میشه که تعداد Thread ها در این تکنیک ثابته.اما بازم این ثابت بودن محدودیت ایجاد میکنه و تکینک دیگه ای با این تکنیک ترکیب میشه که همون Asynchronous یا اجرای غیر همگامه

واسه اطلاعات کاملتر این را مطالعه بفرمایین:
TCP/IP Sockets in C# , Practical guide for programmers

کار پیچیده تر از این حرفاست که دوستان فرمودن

alinoroozi58
چهارشنبه 14 مرداد 1388, 14:41 عصر
راه ساده ترش توی دات نت اینه از متد های آسنکرون beginaccept استفاده کنی.دیگه لازم نیست خودتو در گیر ترد ها بکنی.خود دات نت این کارو برای شما انجام میده.نمیدونم توی دات نت 1.1 ساپورت میشه یا نه.اما توی دات نت 2 حتما انجام میشه

Sociant
چهارشنبه 14 مرداد 1388, 20:47 عصر
راه ساده ترش توی دات نت اینه از متد های آسنکرون beginaccept استفاده کنی.دیگه لازم نیست خودتو در گیر ترد ها بکنی.خود دات نت این کارو برای شما انجام میده.نمیدونم توی دات نت 1.1 ساپورت میشه یا نه.اما توی دات نت 2 حتما انجام میشه

بستگی به حجم باری که رو سرور قراره بیفته داره! خود جناب Asynchronus هم از Thread استفاده میکنه و در صورت بالا رفتن کلاینتها هم منابع به هدر میره هم سرعت کاهش بیشتری پیدا میکنه، باید از ترکیب هر دو استفاده کرد.
پیشنهاد من اینه که روی نوع سرویس دهنده ها مطالعه کنن تا نسبت به انتظارشون یکی از معماریها رو انتخاب کنن.اینجوری مشخص میشه که بهتره از چه تکنیکی واسه پیاده سازیش استفاده کرد.

4 معماری وجود داره:
1- سرویس دهنده گردشی اتصال گرا (iterative-By TCP)
2- سرویس دهنده گردشی فاقد اتصال(iterative - by UDP)
3-سرویس دهنده همزمان اتصال گرا(simultaneous - By TCP)
4- سرویس دهنده همزمان فاقد اتصال(simultaneous - By UDP)

alinoroozi58
شنبه 17 مرداد 1388, 07:29 صبح
مرسی از توضیحتون جناب Sociant
البته ما در حضور اساتید جسارت نمیکنیم.
اگه ممکنه یه توضیح بیشتری بدید که کدوم روش ها رو باید با هم ترکیب کرد؟ thread pool و آسنکرون منظورتونه؟
یکمی توضیح بیشتری بدبد ممنون میشم.
مرسی

FastCode
جمعه 18 دی 1388, 14:37 عصر
من قبلا" سومی رو انجام دادم فکر کنم از بقیا راحتتر باشه.
اخه اون موقع 15 سالم بود.(اگه من بتونم حتما" شما هم می تونید.)
من از system.threading.thread.sleep برای مدیریت منابع استفاده کرده بودم.
سرعت برنامم اصلا" کم نشده بود.