PDA

View Full Version : يك مشكل در انتقال داده ها و درخواست كمك از با تجربه ها در اين زمينه



ali_mohamadi8928
یک شنبه 08 دی 1387, 14:53 عصر
سلام دوستان

من به يك مشكل خيلي بزرگ برخورد كردم كه در واقع ميتونه توي كاراي حرفه اي خيلي مشكل ساز باشه .


من برنامه ي تحت شبكم رو نوشتم و دادم دست مشتري . برنامه با TidTCPClient و TidTCPServer نوشته شده و اونجا روي مثلا 20 تا سيستم كلاينت هست و يك سيستم هم كه سرور هست .

اين برنامه قابليت انتقال فايلها رو توسط خودش داره و بنا بر دلايلي قابليت شرينگ سيستم ها رو بستم تا فقط بتونن توسط برنامهي من فايل بفرستن تا سرور بتونه از فايلهاي انتقال شده با خبر باشه و الي اخر ...

تنها مشكل بزرگم اينه كه اونها فايلها ي حجيم ميفرستن مثلا 20 گيگابايتي . و مثلا 12 دقيقه طول ميكشه و قشنگ هم منتقل ميشه ولي مشكل اينه كه توي اون مدت زمان مثلا اگه يه كلاينت ديگه بخواد يك فايل بفرسته براي يكي ديگه نميتونه و بايد صبر كنه تا حتما اون فايل قبلي تموم بشه و بعد اين بفرسته .

اين به خاطر اينه كه هر كي توي TidTCPClient و TidTCPServer بخواد يك چيزي بفرسته اول اون داده به TidTCPServer ارسال ميشه بعد TidTCPServer بايد اون رو براي كلاينت مورد نظر بفرسته كه اين برام مشكل ساز شده . چون در يك ان واحد نميتونه دو تا چيز مختلف رو براي دو تا كلاينت مختلف بفرسته !!!

ايا ميشه كاري كرد كه بتونه اين كار رو بكنه ؟ يعني وقتي داره فايل رو از طريق يك Stream به كلاينت ميده و وقتي درخواست انتقال يك داده ي ديگه بهش داده شد بتونه اونم در همون زمان انجام بده ؟

مثل اينترنت خودمون ديديد مثلا وقتي يك چيزي داريم دانلود ميكنيم همون موقع ميتونيم يه صفحه ي وب رو هم بارگذاري كنيم يا اصلا ميتونيم يه چيز ديگه هم همراه همون دانلود كنيم .

دوستان لطفا در اين زمينه راهنماييم كنن خيلي مشكل ساز هست اين موضوع برام :عصبانی++:

s_ahmadneya
یک شنبه 08 دی 1387, 15:14 عصر
سلام دوستان

من به يك مشكل خيلي بزرگ برخورد كردم كه در واقع ميتونه توي كاراي حرفه اي خيلي مشكل ساز باشه .


من برنامه ي تحت شبكم رو نوشتم و دادم دست مشتري . برنامه با TidTCPClient و TidTCPServer نوشته شده و اونجا روي مثلا 20 تا سيستم كلاينت هست و يك سيستم هم كه سرور هست .

اين برنامه قابليت انتقال فايلها رو توسط خودش داره و بنا بر دلايلي قابليت شرينگ سيستم ها رو بستم تا فقط بتونن توسط برنامهي من فايل بفرستن تا سرور بتونه از فايلهاي انتقال شده با خبر باشه و الي اخر ...

تنها مشكل بزرگم اينه كه اونها فايلها ي حجيم ميفرستن مثلا 20 گيگابايتي . و مثلا 12 دقيقه طول ميكشه و قشنگ هم منتقل ميشه ولي مشكل اينه كه توي اون مدت زمان مثلا اگه يه كلاينت ديگه بخواد يك فايل بفرسته براي يكي ديگه نميتونه و بايد صبر كنه تا حتما اون فايل قبلي تموم بشه و بعد اين بفرسته .

اين به خاطر اينه كه هر كي توي TidTCPClient و TidTCPServer بخواد يك چيزي بفرسته اول اون داده به TidTCPServer ارسال ميشه بعد TidTCPServer بايد اون رو براي كلاينت مورد نظر بفرسته كه اين برام مشكل ساز شده . چون در يك ان واحد نميتونه دو تا چيز مختلف رو براي دو تا كلاينت مختلف بفرسته !!!

ايا ميشه كاري كرد كه بتونه اين كار رو بكنه ؟ يعني وقتي داره فايل رو از طريق يك Stream به كلاينت ميده و وقتي درخواست انتقال يك داده ي ديگه بهش داده شد بتونه اونم در همون زمان انجام بده ؟

مثل اينترنت خودمون ديديد مثلا وقتي يك چيزي داريم دانلود ميكنيم همون موقع ميتونيم يه صفحه ي وب رو هم بارگذاري كنيم يا اصلا ميتونيم يه چيز ديگه هم همراه همون دانلود كنيم .

دوستان لطفا در اين زمينه راهنماييم كنن خيلي مشكل ساز هست اين موضوع برام :عصبانی++:
سلام خدا قوت
1-برنامه جالبی باید باشه اگه امکانش است سورسش را برای ما بفرست.نیازش دارم!
2-شما بجای ارسال فایل خالی باید یک شی با چند پروپرتی به سرور بفرستی -ipsend , ipreceive, fileو هر تعداد پروپرتی دیگه که نیاز داشته باشی اونوقت سرور می تونه با توجه به ای پی گیرنده متوجه بشه فایل مربوط به کدام کلاینت است.
2- یه راه حل دیگه و بهتر این است که شما بجای اینکه فقط یه سرور داشته باشید هر کلاینتتان یه سرور باشه یعنی برنامه تان را طوری بنویسید که هم بعنوان سرور وهم بعنوان کلاینت عمل کنه!
امیدوارم تونسته باشم منظورم را منتقل کنم!

ali_mohamadi8928
یک شنبه 08 دی 1387, 17:20 عصر
2-شما بجای ارسال فایل خالی باید یک شی با چند پروپرتی به سرور بفرستی -ipsend , ipreceive, fileو هر تعداد پروپرتی دیگه که نیاز داشته باشی اونوقت سرور می تونه با توجه به ای پی گیرنده متوجه بشه فایل مربوط به کدام کلاینت است.


اين موضوع هيچ ربطي به مشكل من نداره . اين كار هم انجام شده براي در اختيار داشتن گزارشات !

من ميخوام در يك ان واحد سرورم بتونه با تخصيص يك باجه ي زماني به هر بسته ي داده اونها رو به صورت منظم و با هم رد و بدل كنه تا سرور بتونه در يك زمان به تمامي كلاينت ها سرويس دهي كنه .

s_ahmadneya
یک شنبه 08 دی 1387, 19:57 عصر
اين موضوع هيچ ربطي به مشكل من نداره . اين كار هم انجام شده براي در اختيار داشتن گزارشات !

من ميخوام در يك ان واحد سرورم بتونه با تخصيص يك باجه ي زماني به هر بسته ي داده اونها رو به صورت منظم و با هم رد و بدل كنه تا سرور بتونه در يك زمان به تمامي كلاينت ها سرويس دهي كنه .
شاید حق با شما باشه .
اما بنظرم راه حل درستی است. فکر کن از دو کلاینت داده به سرور بیاد خوب با داشتن مسیر نباید مشکلی باشه .
یکم روش فکر کن جواب می ده !

Saeed_m_Farid
سه شنبه 10 دی 1387, 21:02 عصر
ين به خاطر اينه كه هر كي توي TidTCPClient و TidTCPServer بخواد يك چيزي بفرسته اول اون داده به TidTCPServer ارسال ميشه بعد TidTCPServer بايد اون رو براي كلاينت مورد نظر بفرسته كه اين برام مشكل ساز شده . چون در يك ان واحد نميتونه دو تا چيز مختلف رو براي دو تا كلاينت مختلف بفرسته !!!

ايا ميشه كاري كرد كه بتونه اين كار رو بكنه ؟ يعني وقتي داره فايل رو از طريق يك Stream به كلاينت ميده و وقتي درخواست انتقال يك داده ي ديگه بهش داده شد بتونه اونم در همون زمان انجام بده ؟
سلام دوست عزيز:
بله ميشه، شما بايد يه مكانيزم Queuing واسه خودتون داشته باشين، چون شما تو يه شبكه دارين كار ميكنين و مشكلات اينترنت رو ندارين كارتون راحتتره‌: منظورم اينه كه شما مثلا بايد يه thread تو سرور داشته باشين و همچنين درخواستهاي ورودي رو تو يه صف بذارين كه thread نسبت به اولويت درخواستها بايد به اونها رسيدگي كنه؛ البته اون thread‌ بايد هميشه درحالت wait باشه تا به درخواستها رسيدگي كنه و ازطرف ديگه همونطوريكه حتما ميدونين بايد مواظب كار با منابع سيستمتي كه واسه اين كار ميگيرين تو thread هاتون باشين چون دارين با حجم زيادي كار ميكنيد.
اميدوارم كمكي كرده باشم ولي واسه توضيح بيشتر بايد توپول‍وژي خودتون رو بهتر باز كنيد چون مطمئنا با گذاشتن يه TidTCPServer تو سرور در يه شبكه پركار مطمئن باشين دير يا زود برنامه سرورتون ميتركه!
با تشكر.