View Full Version : سوال: کنترل Read/Write Stream TCPServer
Delphi 2010
پنج شنبه 21 شهریور 1392, 14:14 عصر
با عرض سلام و خسته نباشید
یه سوال داشتم خدمت دوستان عزیز
ما وقتی با دستورات زیر کار میکنیم
AContext.Connection.IOHandler.Write();
AContext.Connection.IOHandler.ReadStream();
برای ارسال Text اون رو با یه Stringlist ذخیره و مجددا ارسال میکنیم توی برنامه چت
آیا توی تعداد بالای کاربر های سرور برنامه توی این ذخیره Stream و Load Stream قاطی نمی کنه چون داره با یه فایل کار میکنه؟
یا اینکه ما باید این فایل ها رو کنترل کنیم؟
در مثال اول خودم کنترل کردم فایل ها رو و در مثال دوم بر عهده TCPServer گذاشتم
کدومش منطقی تر هستش و در تعداد بالا (اتصال کاربر زیاد مثلا 2000 کاربر) جواب میده
چون ممکنه در هر ثانیه 100 تا پیام رد و بدل بشه بین کاربران و سرور باید کنترل بکنه این پیغام های ارسالی و دریافتی رو
ممنون میشم استادان بنده، من رو یاری کنن
Delphi 2010
پنج شنبه 21 شهریور 1392, 14:14 عصر
کد زیر برای مثال میتونه خوب باشه
این کد به وسیله یه مشخص کننده فایل رو به صورت جداگانه ذخیره می کنه و بعد از اتمام کار پاک میکنه اون فایل رو
function SendMessage(Msg: WideString): string;
var
Ms: TMemoryStream;
SaveStream: TStringList;
begin
SaveStream := TStringList.Create;
SaveStream.Text := Msg;
SaveStream.SaveToFile(IntToStr(AContext.Binding.Ge tHashCode) + '.dat');
Ms := TMemoryStream.Create;
Ms.LoadFromFile(IntToStr(AContext.Binding.GetHashC ode) + '.dat');
Ms.Position := 0;
AContext.Connection.IOHandler.LargeStream := True;
try
AContext.Connection.IOHandler.Write(Ms, 0, True);
finally
Ms.Free;
FreeAndNil(SaveStream);
if FileExists(IntToStr(AContext.Binding.GetHashCode) + '.dat') then
DeleteFile(IntToStr(AContext.Binding.GetHashCode) + '.dat');
end;
Delphi 2010
پنج شنبه 21 شهریور 1392, 14:18 عصر
این کد هم هر بار ارسال رو داخل یه فایل ذخیره میکنه
function SendMessage(Msg: WideString): string;
var
Ms: TMemoryStream;
SaveStream: TStringList;
begin
SaveStream := TStringList.Create;
SaveStream.Text := Msg;
SaveStream.SaveToFile('SendInfo.dat');
Ms := TMemoryStream.Create;
Ms.LoadFromFile('SendInfo.dat');
Ms.Position := 0;
AContext.Connection.IOHandler.LargeStream := True;
try
AContext.Connection.IOHandler.Write(Ms, 0, True);
finally
Ms.Free;
FreeAndNil(SaveStream);
end;
Mask
پنج شنبه 21 شهریور 1392, 17:05 عصر
جون داره هر کدوم رو در یه ترد جداگانه بررسی میکنه مشکلی پیش نمیاد.
Delphi 2010
پنج شنبه 21 شهریور 1392, 17:13 عصر
بررسی کردن نیست عزیزم
داره داخل فقط یه فایل جدا از تردهای برنامه کار میکنه
بحث فقط برنامه نیست و اینجا ویندوز هم مطرح هست
Mask
پنج شنبه 21 شهریور 1392, 17:18 عصر
بررسی کردن نیست عزیزم
داره داخل فقط یه فایل جدا از تردهای برنامه کار میکنه
بحث فقط برنامه نیست و اینجا ویندوز هم مطرح هست
اصلا استفاده از فایل توصیه نمیشه ، به خاطر مسایل امنیتی و سرعت.
همینجور که دیتا تو حافظه هست باید سند ریسیو بشه.
نیازی به ذخیره و یا حذف نیست.
Delphi 2010
پنج شنبه 21 شهریور 1392, 17:23 عصر
با چه کدی stream رو بگیریم و همونجا تو حافظه بریزیم تو string?
الان با کد بالا stream تو حافظه هست ولی با چه دستوری باید تبدیلش کرد؟
Mask
پنج شنبه 21 شهریور 1392, 17:35 عصر
به جای FileStream باید از MemoryStream استفاده کنید.
همینطور که مموری استریم دیتا رو میگیره به صورت مستقیم هم میتونید نمایش بدید و هم ارسال کنید.
کلیه کامپوننتهای کار با حافظه پروپرتی های To String و ToStream رو دارا هستند.
Delphi 2010
پنج شنبه 21 شهریور 1392, 17:43 عصر
یه با پروپرتی ToString MemoryStream میشه کارکترهای داخلش رو بدست آورد؟
یا منظورتون چیز دیگه ای هستش؟
Delphi 2010
جمعه 22 شهریور 1392, 00:06 صبح
میشه یه نمونه کد برای این امر که فرمودید بگذارید
من هرچی تلاش کردم نتونستم این تبدیل رو توی حافظه انجام بدم
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.