ورود

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



sajioo
پنج شنبه 19 تیر 1393, 08:46 صبح
دوستان عزیزم سلام و وقت بخیر
بنده چند وقتی با کمک اساتید همین سایت تونستم یک برنامه کلاینت سرور ساده طراحی کنم.
حالا می خوام به یک دید کلی در برخی مسائل برسم.
برای مثال فرض کنید کلاینت به سرور متصل میشه و یک عملیات ریاضی را برای سرور ارسال می کنه و سرور عملیات را حل کرده و جوابش رو به کلاینت ارسال می کنه.
این قابل انجام است.
اما می خوام یک دید صحیح در خصوص نحوه ی کار سرور داشته باشم.
حالا فرض کنید قراره سرور یک سری اطلاعات رو از دیتابیس بخونه و به کلاینت بفرسته.
این بازم عملیه اما سوال اصلی من اینه که وقتی مثلا 1000 کلاینت به صورت همزمان به سرور اتصال دارند و هر کدام می خوان اطلاعاتی خاص خودشان را از دیتابیس توسط سرور دریافت کنند چه باید کرد؟
منظورم ایه که سرور شلوغ نمیشه و جوابگو هست یا نه؟
برای مثال نرم افزار بنده یک نام کاربری به سرور ارسال میکنه.
سرور با توجه به IdTCPServer1Execute میاد نام کاربری رو میگیره و در دیتابیس جستجو کرده و اطلاعاتی نظیر سن و تحصیلات و ... رو برای کلاینت میفرسته.
الان در رخداد IdTCPServer1Execute آیا یک ترد ایجاد میشه و اگر 100 یا 1000 کلاینت باهم به سرور وصل بشن برای هرکدام یک ترد ایجاد میکنه و در خواستاشونو به صورت موازی انجام میده یا نه 1000 درخواست رو به صورت یک لیست گرفته و یکی یکی انجام میده و پس از انجام هرکدام نتیجه را به کلاینت مربوط ارسال کرده و میره سراغ بعدی؟
تشکر میکنم در این خصوص یک دید کلی و جامع به بنده بدید و یا نظرات و تجربیات خود را با بنده شریک کنید.

Mask
جمعه 20 تیر 1393, 23:52 عصر
این بازم عملیه اما سوال اصلی من اینه که وقتی مثلا 1000 کلاینت به صورت همزمان به سرور اتصال دارند و هر کدام می خوان اطلاعاتی خاص خودشان را از دیتابیس توسط سرور دریافت کنند چه باید کرد؟
جوابگو بودن تعداد کاربران، برنامه شما بستگی به performance سرورتون داره.
البته محدودیت تعداد کانکشن و تردهای ساخته شده ، ویندوز هم مزید برعلت هست. البته استفاده از لینوکس میتونه این تعداد رو به اندازه قابل توجهی افزایش بده.

سرور با توجه به IdTCPServer1Execute میاد نام کاربری رو میگیره و در دیتابیس جستجو کرده و اطلاعاتی نظیر سن و تحصیلات و ... رو برای کلاینت میفرسته.
از چه بانک اطلاعاتی استفاده میکنید؟ اگه از sql استفاده کنید مشکل مالتی یوزر و حذف یا مشکل در داده ها رو با پیاده سازی صحیح میتونید برطرف کنید.
پیشنهاد میکنم برنامه رو با همین دید طراحی کنید. یعنی در هر تردی که برنامه داره جواب میده عملیات پاسخگویی رو بدون درگیری با قسمتهای عمومی برنامه پیاده سازی کنید.
مثلا : میخام در بانکم بر اساس هر کاربری که متصل میشه و نام کاربریش رو ارسال میکنه مقداری منحصر به فرد برگشت داده بشه. اینجاست که در درجه اول باید از متغیرهای عمومی و پابلیک در پروسیجر مربوطه استفاده نشه.
کد رو ببینید: میخام یک کوئری بگیرم :

uses ActiveX;


{$R *.dfm}


procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);


procedure SendMsg(datas1: string);
begin
AContext.Connection.IOHandler.WriteLn(datas1, Tencoding.Unicode);
end;
var
Qry1: TADOQuery;
TCPClient: TIdTCPClient;
data1: string;
begin
data1 := AContext.Connection.IOHandler.ReadLn();
CoInitialize(nil);
Qry1 := TADOQuery.Create(nil);
try
Qry1.Connection := ADOConnection1;
Qry1.CursorLocation := clUseClient;
Qry1.LockType := ltOptimistic;
Qry1.CursorType := ctStatic;


Qry1.SQL.Clear;
Qry1.SQL.Append('select * from Login where (UserNameS=''' + data1
+ ''')');
Qry1.Open;


if Qry1.RecordCount = 1 then
SendMsg(Qry1.FieldByName('CodeS').Text);
finally
Qry1.Free;
end;
CoUninitialize();
end;
در این کد هر تردی که ساخته میشه یک کوئری ساخته شده ، عملیات مورد نظر رو انجام و سپس free میشه.
البته در مواقعی که نیاز به استفاده از منابه مشترک دارید ، استفاده از کریتیکال سکشن ها فراموش نشود.
اینطوری دیگه 1000 تا یوزر هم متصل بشوند مشکلی پیش نمیاد.
کلیه این صحبتها و مثال ها برای این بود که در زمان طراحی برنامه ، برنامه رو یک برنامه مالتی یوزر ببینید و تمهیدات مورد نظر رو بیاندیشید.

sajioo
شنبه 21 تیر 1393, 09:36 صبح
برنامه رو یک برنامه مالتی یوزر ببینید و تمهیدات مورد نظر رو بیاندیشید.


این تمهیدات بیشتر شامل چه مواردی میشه به نظر خودت؟