ورود

View Full Version : حرفه ای: ارسال پیامی مشابه به تمامی کلاینت ها



sajioo
شنبه 15 شهریور 1393, 15:16 عصر
سلام دوستان در یک برنامه کلاینت سرور با indytcpserver/client
فرض می کنیم 500 کلاینت به سرور متصل هستند
بهترین روش برای ارسال یک متن به تمام کلاینت ها چه روشی است؟
یک روش که بنده ازش استفاده می کنم
قرار دادن ترد کلاینت ها در آرایه و سپس پیمایش ارایه با حلقه for و ارسال به تک تک کلاینت ها
آیا راه بهتری هست؟
با تشکر

sajioo
شنبه 15 شهریور 1393, 21:49 عصر
دوستان یک راه معقول دیگه بنده یافتم که به اشتراک میذارم
اگر کسی باز راه دیگه ی پیدا کرد همینجا بیان کنه همه استفاده کنند



Var
Clients : TList;
i : integer;
begin

if not Assigned(IdTCPServer1.Contexts) then exit;

Clients:=IdTCPServer1.Contexts.LockList;
try
for i := 0 to Clients.Count-1 do
try
TIdContext(Clients[i]).Connection.IOHandler.Write(LBuffer);//LBuffer is a TBytes with the data to send
except
...
end;
finally
IdTCPServer1.Contexts.UnlockList;
end;

end;



منبع سایت stackoverflow

یوسف زالی
شنبه 15 شهریور 1393, 22:50 عصر
سلام. UDP رو تست کردید؟

sajioo
یک شنبه 16 شهریور 1393, 08:08 صبح
سلام. UDP رو تست کردید؟

نه یوسف جان . میشه راهنمایی بفرمایی؟

یوسف زالی
یک شنبه 16 شهریور 1393, 08:49 صبح
یک سری کامپوننت وجود داره که با پروتکل UDP کار می کنند، این پروتکل نقطه به نقطه نیست و می تونه یک پیام رو broadcast کنه (خودم چنین کاری نکردم)
بابت قضیه دیتالاست هم نگرانی وجود نداره، یادمه کامپوننت هایی ارائه شده بود که دیتالاست نبود ولی از UDP استفاده می کرد.
اطلاعات بیشتری الان خاطرم نیست، یه جستجویی کن، فکر کنم گیرش بیاری.

ابوالفضل عباسی
یک شنبه 16 شهریور 1393, 09:35 صبح
sajioo عزیز برنامه جالبی نوشتی ولی اگر کاری کنی که بشه کلاینت هارو خودت انتخاب کنی بهتره.
مثلا چندتا radiobutton بگذاری و کلاینت هارو انتخاب کنی و برای اون ها این پیام بره.
کارهم ساده است اگر ای پی اون هارو بدونی به ان ها یک عدد تعلق می دهی و در on key رادیو می نویسی این پیامی که مثلا در ادیت هست به این عدد ها برود که این عدد ها شامل ای پی هست و به ای پی اون شخص می فرستد.:لبخند:

sajioo
یک شنبه 16 شهریور 1393, 11:34 صبح
اطلاعات بیشتری الان خاطرم نیست، یه جستجویی کن، فکر کنم گیرش بیاری.
آره بگردم ببینم چیزی گیرم میاد:لبخند:




sajioo عزیز برنامه جالبی نوشتی ولی اگر کاری کنی که بشه کلاینت هارو خودت انتخاب کنی بهتره.
مثلا چندتا radiobutton بگذاری و کلاینت هارو انتخاب کنی و برای اون ها این پیام بره.
کارهم ساده است اگر ای پی اون هارو بدونی به ان ها یک عدد تعلق می دهی و در on key رادیو می نویسی این پیامی که مثلا در ادیت هست به این عدد ها برود که این عدد ها شامل ای پی هست و به ای پی اون شخص می فرستد.


xe7 عزیز این کار که گفتی مشکلی ندارم و قابل اجراست با یک حلقه
اما من می خوام به قول یوسف جان یک
broadcast بوجود بیارم و از دست حلقه راحت بشم
اگر منظورتو درست فهمیده باشم . اگر نه که بیشتر توضیح بده

ابوالفضل عباسی
یک شنبه 16 شهریور 1393, 16:09 عصر
اختیار داری درست فهمیدی broadcast هم خوبه اما مشکلی که من بهش بر خوردم اینکه اگر string توش بنویسی ازت قبول نمی کنه فقط متغیر های integer رو قبول می کنه

sajioo
یک شنبه 16 شهریور 1393, 18:03 عصر
میشه یک نمونه کد بذاری متوجه منظورت بشم؟

ابوالفضل عباسی
دوشنبه 17 شهریور 1393, 11:52 صبح
یک نمونه برنامه ساده از chek box نوشتم ولی وقت نکردم از broadcast استفاده کنم یه نواقصی هم داره که می تونی برطرفش کنی امام اجرا می شه امیدوارم بتونه کمکت بکنه sajioo عزیز
با دلفی xe6 نوشته ام . http://uploadco.ir/uploads/ye0xyjk5yagookwdchah.zip

Mask
سه شنبه 18 شهریور 1393, 02:13 صبح
سلام دوستان در یک برنامه کلاینت سرور با indytcpserver/client
فرض می کنیم 500 کلاینت به سرور متصل هستند

چون نوشتید متصل هستند پس در قسمت bind connected کلیه ip هایی که متصل هستند رو دارید و میتونید ، کدی شبیه به کدی که نوشتید رو استفاده کنید.


بهترین روش برای ارسال یک متن به تمام کلاینت ها چه روشی است؟

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


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

مخلصیم داش یوسف . اما این. از کجا در آوردی؟؟؟؟؟؟؟؟؟؟؟؟؟؟:متعجب: :کف::قلب::لبخندساده:
کلا پروتکل udp یعنی پکت لاست . البته پروتکل جدیدی ساخته شده که فقط در V6 جواب میده که از هدرهای udp استفاده میکنه و چون ساختارش ، یه ساختاره جدیده، اعلام شده پکت لاست نداره. اما هنوز عمومی و عرف نیست.
در مورد سوال دوست عزیزمون :
اگر تضمین ارسال و دریافت براتون مهم هست ، باید حتما لیست کلاینتهای موجود رو بدست آورده و یه بسته Tcp برای همه ارسال کنید . اما اگه این اطمینان زیاد براتون مهم نیست ، میتونید از Udp استفاده کنید ، که کار کردن با بسته OverByte رو برای udp بهتون پیشنهاد میکنم.

یوسف زالی
سه شنبه 18 شهریور 1393, 10:27 صبح
مخلصیم داش یوسف . اما این. از کجا در آوردی؟

قربونت برم با هم نشستیم در موردش تحقیق کردیما، فراموش کار نبودی که!
اسمش رو یادم رفته، ولی سر قضیه نوشتن تیم ویوور مگه یادت نیست رفتیم دنبالش؟
پیاده سازی جدیدی از کامپوننت ایندی بود، از UDP استفاده می کرد ولی لاست نداشت؟ مطمئنم که یادت میاد.
درسته که عمومی نیست ولی عمومی نبودنش که وجودش رو نقض نمی کنه!

BORHAN TEC
سه شنبه 18 شهریور 1393, 10:38 صبح
سلام :قلب:


پیاده سازی جدیدی از کامپوننت ایندی بود، از UDP استفاده می کرد ولی لاست نداشت؟ مطمئنم که یادت میاد.
اگه یادتون اومد اسمش رو بگین. :کف: