ورود

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



khazaie01
شنبه 17 مرداد 1388, 10:20 صبح
سلام دوستان برنامه ای دارم که سرور با توجه به درخواست کلاینت از وبکم عکس میگیره تو فایل ذخیره میکنه و بعد فایل را ارسال میکنه به کلاینت. کلاینت هم هر 1 میلی ثانیه این درخواست را میده.... با یک کلاینت مشکلی نداره ولی وقتی چندتا کلاینت همزمان به سرور وصل میشن, سرور نمیتونه به همه سرویس بده و ارتباط همه ی کلاینتها را به غیر از یکی قطع میکنه
مشکل کجاست ؟

Felony
شنبه 17 مرداد 1388, 11:19 صبح
فایل رو به چع صورت میفرستین ؟

khazaie01
شنبه 17 مرداد 1388, 11:54 صبح
فایل را داخل استریم ذخیره میکنم و بعد استریم را میفرستم

Felony
شنبه 17 مرداد 1388, 12:23 عصر
دقیق نمیدونم ، ولی فکر کنم مشکل از این باشه که شما مقدار MaxCoanection رو تنظیم نکردین .
شاید هم باید بعد از اتصال هر کلاینت یه نخ جدا براش ایجاد کرد و به وسیله ی نخ مربوط به هر کلاینت بهش اطلاعات رو بدی .

حامد مصافی
شنبه 17 مرداد 1388, 12:32 عصر
بله, همیشه همینطوره هر سوکت سرور فقی می تونه جوابگوی یک سوکت کلاینت باشه. شما باید بعد از هر اتصال یک سوکت سرور جدید ایجاد کرده و اونو در حالت listen قرار بدین.

khazaie01
شنبه 17 مرداد 1388, 12:34 عصر
فکر نکنم از MaxCoanection باشه ... وقتی تو کلاینت Interval تایمری که درخواست را ارسال میکنه را 1000 میکنم 2 تا همزمان اجرا میشن ولی 3 تا باز مشکل پیش میاد

khazaie01
شنبه 17 مرداد 1388, 12:39 عصر
بله, همیشه همینطوره هر سوکت سرور فقی می تونه جوابگوی یک سوکت کلاینت باشه. شما باید بعد از هر اتصال یک سوکت سرور جدید ایجاد کرده و اونو در حالت listen قرار بدین.

هر IdTCPServer میتونه همزمان به چندتا کلاینت سرویس بده در این که شکی نیست...
من هر دفعه که کلاینت درخواس میده عکس وبکم را داخل فایلی ذخیره میکنم و بعد اون فایل را به JpegImage لود میکنم و در استریم ذخیره ... در آخر هم استریم را میفرستم ...

حامد مصافی
شنبه 17 مرداد 1388, 13:06 عصر
مگر اینکه به صورت تو کار این عمل رو انجام بده. محیط توسعه و ابزار شما چیه؟

khazaie01
شنبه 17 مرداد 1388, 16:56 عصر
محیط توسعه و ابزار شما چیه؟
تو بخش مربوط به دلفی تاپیک زدم پس بی شک محیط توسعه من هم دلفی است , ابزار هم که اسم کامپوننت را تو پست قبلیم گفتم از ابزارهای Indy استفاده میکنم (IdTCPServer , IdTCPClient)

vcldeveloper
شنبه 17 مرداد 1388, 17:27 عصر
بعد از اتصال هر کلاینت به سرور، چه کاری انجام میدید؟ چه کدی برای ارسال Stream آماده شده از سرور به کلاینت می نویسید؟

khazaie01
شنبه 17 مرداد 1388, 17:59 عصر
try
s:=TMemoryStream.Create;
s1:=TMemoryStream.Create;
VideoCap1.SnapShotJPEG('d:\1.jpg',100);
j.LoadFromFile('d:\1.jpg');
// j.CompressionQuality:=50;
// j.Compress;
j.SaveToStream(s);
s.Position:=0;
CompressStream(s,s1);
ASender.Thread.Connection.WriteStream(s1,true,true );
finally
s.Free ;
s1.Free;
end;



این کد رویداد onCommand سرور
فکر کنم تو دسترسی به فایل مشکل پیدا میکنه نه ؟ تابعی برای تشخیص باز بودن فایل نیست ؟

Felony
شنبه 17 مرداد 1388, 19:38 عصر
خوب ببینید شما درخواست ها رو به ترتیب ذخیره کنید و با یک حلقه تک تک به درخواست این کلاینت ها پاسخ بدید .

khazaie01
شنبه 17 مرداد 1388, 20:20 عصر
یعنی توی رویدادی که این کدها را نوشتم فقط ip کلاینت را در یک لیست ذخیره کنم و بعد با یک تایمر عکس را به ترتیب به ip های لیست بفرستم ؟ کلاینتها فقط یک درخواست دارن اونم درخواست ارسال عکس ....

Felony
شنبه 17 مرداد 1388, 20:36 عصر
درسته ، آدرس IP سیستم های درخواست کننده رو در این رویداد به یک StringList اضافه کنید و هر 1 ثانیه با یک حلقه از اول تا آخر لیست بخونید و توی حلقه به سیستم های درخواست کنده تک تک پاسخ بدید ( عکس رو به ترتیب به IP های ذخیره شده تو لیست بفرستید ) .

khazaie01
شنبه 17 مرداد 1388, 20:51 عصر
یه سوال وقتی تو رویداد OnCommand کامپوننت IdTCPServer مینویسم با استفاده از ASender برای کلاینت استریم را میفرستم تو رویداد OnTimer چی بنویسم ؟! چجوری بگم به این ip بفرست ؟

Felony
شنبه 17 مرداد 1388, 22:22 عصر
میتونید با یه IdTCPClient بفرستید یعنی همه ی Client هاتون یه کامپوننت IdTCpServer داشته باشن و هنگامی که درخواست میدن به برنامه ی سرور برنامه ی سرور IP اونها رو بخونه و به وسیله ی یک IdTCPClient به IP اونها وصل شه و اطلاعات رو براشون بفرسته و بعد Diconnect بشه و بره سراغ IP بعدی .

khazaie01
یک شنبه 18 مرداد 1388, 07:57 صبح
ممنون... مشکل اصلی برنامه اینه که وقتی 2 تا کلاینت همزمان وصل میشن , تداخلی بین نوشتن و خواندن از فایل بوجود میاد ... میخوام بدونم دستوری هست که تشخیص بده فایل باز شده (در حال ویرایش یا ایجاد) ؟
اگه بشه تشخیص داد که فایل درحال ویرایش یا ایجاد هست میشه خواندن از فایل را متوقف کرد و در نتیجه خطا از بین خواهد رفت...اگه این عملی بشه برای من کارایی بیشتری خواهد داشت
ممنووووووووووووون

vcldeveloper
یک شنبه 18 مرداد 1388, 19:31 عصر
مشکل اصلی برنامه اینه که وقتی 2 تا کلاینت همزمان وصل میشن , تداخلی بین نوشتن و خواندن از فایل بوجود میاد
شما باید با استفاده از Synchronization Objects دسترسی به فایل را Serialize کنید. اولا اصلا نیازی نیست که هر بار کلاینتی درخواست داد، شما تصویر جدیدی کپچر کنید و در فایل ذخیره کنید. بلکه میتونید یک Thread جدید ایجاد کنید که در فواصل زمانی معین، مثلا هر یک ثانیه، تصویر وب کم را در فایل مورد نظر ذخیره کنه. Threadهای مربوط به کلاینت ها فقط آن فایل را بخوانند. برای Serialize کردن دسترسی فایل در همچین حالتی، می تونید از کلاس TMultiReadExclusiveWriteSynchronizer استفاده کنید. اسم کوتاه تر این کلاس TMREWSync هست.

در ضمن، وقتی try-finally می نویسید تا شی ایی را که ایجاد کردید در پایان کار آزاد کنید، ساخت شی باید قبل از try باشه، نه داخل try.