PDA

View Full Version : بهترین روش ارتباط چند کامپیوتر با هم از طریق شبکه



seyed_farid
جمعه 26 اسفند 1390, 00:01 صبح
من میخواهم بین چند کامپیوتر ارتباط تکست ایجاد کنم و هر سیستم بتواند به هر کامپیوتری که میخواهد ارسال پیام نماید. ( با IP و Port) بهترین روش انجام اینکار چیست بگونه ای که برنامه ها منتظر کسی نماند ( بلاک نشود )؟:تشویق:
و نیز برای ارسال پیام در هر سیستم ایجاد صف ارسال نماید چون دستور ارسال پیام از جاهای مختلف برنامه انجام میشود و ممکن است باهم ارسال شود و در این صورت نیز نباید چیزی از دست برود.
ضمناً این برنامه ها هم میبایست 24 ساعته و شبانه روزی و مداوم کار کنند.

Felony
جمعه 26 اسفند 1390, 04:42 صبح
بهترین و ساده ترین راه استفاده از Indy هست ، حالا استفاده از کدوم پرتوکول بستگی به نیازهای خودتون داره .
در مورد جلوگیری از فریز شدن برنامه کامپوننت Anti Freeze خود Indy از فریز شدن برنامه جلوگیری میکنه ، برای ارسال پیغام از جاهای مختلف برنامه من بودم یک تابع برای ارسال پیغام تو یک کتابخانه جدا میساختم و تو اون صف رو پیاده میکردم ، اگر با پیاده سازی صف با کلاس هایی مثل TList آشنایی داردید ، این کلاس میتونه گزینه مناسبی باشه ، ولی در این مورد خاص اگر کارتون فقط ارسال متن هست با یکم خلاقیت میتونید توسط کلاس TStringList هم از پس پیاده سازی همچین صفی بر بیاید .

seyed_farid
جمعه 26 اسفند 1390, 11:10 صبح
ممنون از پاسختون
من قبلا این برنامه رو با TServerSocket و TClientSocket اجرا کرده ام ولی در صورتیکه ارتباط بهر علتی قطع بشه برنامه باید چک کنه و در اولین زمان ممکن ارتباط برقرار بشه. اما با این کومپوننتها به مشکل خوردم و پس از چندین بار ( برای سیستم من در حدود 2000بار) تلاش برای اتصال، سیستم Memory Lake میشه و حتما بایست سیستم ویندوز ریستارت بشه و با ریستارت برنامه تنها، مشکل حل نمیشه ( که این برای سیستمی که 24 ساعته است قابل قبول نیست ).:ناراحت:
حالا آیا این Indy این مشکل را نداره؟

اما در مورد ایجاد صف و پیاده سازی آن نمونه کاری هست که بتونم ازش ایده بگیرم؟:قلب::تشویق:

vcldeveloper
جمعه 26 اسفند 1390, 13:04 عصر
و نیز برای ارسال پیام در هر سیستم ایجاد صف ارسال نماید چون دستور ارسال پیام از جاهای مختلف برنامه انجام میشود و ممکن است باهم ارسال شود و در این صورت نیز نباید چیزی از دست برود.
برای این کار می تونید یک صف به صورت Blocking Queue و یک Thread ارسال کننده پیام که محتوای این صف را واکشی میکنه، داشته باشید. فرآیند کار به این صورت هست که بخش های مختلف برنامه پیام های مدنظر خودشان را در این صف قرار میدند، و ثبت پیام در صف به صورت Synchronous انجام میشه، تا در صورت ثبت همزمان چند پیام، پیامی از بین نره. Thread ارسال کننده هم تا زمانی که داده ایی در صف قرار نگرفته باشه، در خواب به سر میبره. هر زمان که داده ایی در صف قرار بگیره، از حالت خواب خارج میشه، و تا پایان یافتن پیام های موجود در صف، آنها را یکی یکی واکشی کرده و ارسال میکنه. با اتمام پیام ها، Thread ارسال کننده دوباره به حالت خواب میره، و منتظر پیام جدید میشه.

در داخل Thread ارسال کننده می تونید از IdTCPClient (از مجموعه Indy) برای ارسال داده استفاده کنید. برای دریافت داده نیازی به ایجاد یک Thread توسط شما نیست، و IdTCPServer خودش برای این کار یک Thread ایجاد میکنه، و در صورت دریافت پیام، رویداد مشخصی را برای شما فراخوانی میکنه.

برای پیاده سازی Blocking Queue هم اگر از دلفی XE یا XE2 استفاده می کنید، می تونید از کلاس TThreadedQueue استفاده کنید. راه دیگه استفاده از پیاده سازی های آماده شده توسط دیگران هست، مثل BlockingQueue در مجموعه OmniThread. راه سوم هم این هست که خودتون همچین کلاسی رو بنویسید، که برای این کار می تونید یک کلاس جدید از TQueue دلفی مشتق کنید، و خودتون با استفاده از TMonitor یا هر Synchronization Object دیگه ایی ورود و خروج داده به صف را Synchronize کنید. برای این کار هم نمونه کدهایی در اینترنت می تونید پیدا کنید

seyed_farid
جمعه 26 اسفند 1390, 20:37 عصر
تشکر برادر:قلب:
نمونه برنامه جایی سراغ دارید که بتونم ازش استفاده و الگو بگیرم؟:تشویق:

درمورد ارتباط به نظر شما رو هر برنامم از ایندی سرور( برای دریافت) و ایندی کلاینت ( برای ارسال) استفاده کنم بهتره یا تو یکی از سرور و تو دیگری از کلاینت استفاده کنم و برای کلاینت یک ترد برای دریافت بذارم؟

seyed_farid
پنج شنبه 29 تیر 1391, 00:25 صبح
نظر دوستان در مورد این سوال چیه؟
درمورد ارتباط به نظر شما رو هر برنامم از ایندی سرور( برای دریافت) و ایندی کلاینت ( برای ارسال) استفاده کنم بهتره یا تو یکی از سرور و تو دیگری از کلاینت استفاده کنم و برای کلاینت یک ترد برای دریافت بذارم؟

seyed_farid
یک شنبه 01 مرداد 1391, 14:25 عصر
:خجالت:یعنی به نظر شما رو هر برنامم از ایندی سرور( برای دریافت) و ایندی کلاینت ( برای ارسال) استفاده کنم بهتره ؟

Mask
یک شنبه 01 مرداد 1391, 14:43 عصر
:خجالت:یعنی به نظر شما رو هر برنامم از ایندی سرور( برای دریافت) و ایندی کلاینت ( برای ارسال) استفاده کنم بهتره ؟

اگه امکانش رو داری بله . وگرنه اگه قضیه آی پی های غیر ولید رو داشته باشید ، این متد بهتون جواب نمیده.

seyed_farid
یک شنبه 01 مرداد 1391, 18:35 عصر
بله. من ميخوام تعداد محدودي كامپيوتر را بهم ارتباط بدم. آي پي را هم خودم براشون تعريف ميكنم. پس همين حالت برام خوب جواب ميده ديگه؟

Mask
چهارشنبه 04 مرداد 1391, 14:33 عصر
هر پست دارای ابزار مدیریتی هست.
شما رو ویرایش پست کلیک کن . بعدش گزینه حذف براتون میاد.