ورود

نسخه کامل مشاهده نسخه کامل : IdTCPServer



MAR_Programmer
05-05-2008, 06:17
سلام
می خواستم ببینم این کامپوننت متدی، چیزی داره که از طریق اون بشه تعداد Client های متصل به اونو فهمید یا نه!
اگه راهی هست راهی هم وجود داره که از طریق اون برای همه Client های فعلی یه پیام عمومی بفرستیم یا نه؟؟
مورد دوم مهمتره اگه کامپوننت دیگه ای هست که این کار رو میکنه لطفا معرفی کنید (خیلی پیچیده نباشه و در ضمن جزء کامپوننت های پیش فرض باشه آخه راحتره)
:31::31::31::31::31::31::31:
از توجهتون خیییییییییییییلی ممممممنونم
:11::11::11::11:

MAR_Programmer
05-05-2008, 06:22
اگه یه COM+ Service داشته باشیم چه جوری یه Client میتونه به اون از طریق Server دسترسی داشته باشه؟
منظورم اینه که توی عبارت زیر به جای MachineName جی باید گذاشت، IP آدرس ماشین رو یا اسم ماشینو
Coaaa.CreateRemote(const MachineName: string
من هردو تاشو امتحان کردم کار نمی کنه البته در مورد نام ماشین یکم شک دارم
بازم ممنون
:46::46::46::46::46::46:

VDeveloper
05-05-2008, 17:23
می خواستم ببینم این کامپوننت متدی، چیزی داره که از طریق اون بشه تعداد Client های متصل به اونو فهمید یا نه!
اگه راهی هست راهی هم وجود داره که از طریق اون برای همه Client های فعلی یه پیام عمومی بفرستیم یا نه؟؟
به ازاء هر کلاینتی که به سرور وصل میشه، Indy یک Thread در سمت سرور میسازه که این Thread در هنگام اتصال در دسترس شما قرار داره و در داخل خودش مشخصات کلاینت رو نگه داری میکنه. می تونید در زمان اتصال کلاینت ها اشاره گری به Thread هر کلاینت را در لیستی نگه داری کنید، به این ترتیب، هم تعداد کلاینت ها رو می تونید از روی تعداد Item های لیست بفهمید، هم می تونید با استفاده از Thread مربوطه آدرس هر یک از کلاینت ها را بدست بیارید، و براشون، پیام ارسال کنید. البته در Indy کامپوننت های سرور فقط امکان پاسخ به کلاینت را دارند و نمی تونند خودشون شروع کننده ارتباط باشند. برای شروع یک ارتباط می تونید در سمت کلاینت خودتون هم یک سرور داشته باشید.

MAR_Programmer
06-05-2008, 15:39
به ازاء هر کلاینتی که به سرور وصل میشه، Indy یک Thread در سمت سرور میسازه که این Thread در هنگام اتصال در دسترس شما قرار داره و در داخل خودش مشخصات کلاینت رو نگه داری میکنه. می تونید در زمان اتصال کلاینت ها اشاره گری به Thread هر کلاینت را در لیستی نگه داری کنید، به این ترتیب، هم تعداد کلاینت ها رو می تونید از روی تعداد Item های لیست بفهمید، هم می تونید با استفاده از Thread مربوطه آدرس هر یک از کلاینت ها را بدست بیارید، و براشون، پیام ارسال کنید. البته در Indy کامپوننت های سرور فقط امکان پاسخ به کلاینت را دارند و نمی تونند خودشون شروع کننده ارتباط باشند. برای شروع یک ارتباط می تونید در سمت کلاینت خودتون هم یک سرور داشته باشید.

ممکنه یک مثال بزنی مثلا تعداد Thread های موجود در Server رو مشخص کنه و به Thread ای که مثلا دارای IP ادرس 192.168.106.20 یه پیام بفرسته.
اگر خاصیت مربوطه رو میگفتی بهتر بود چون خودم من از Thread ها استفاده کردم نشد - یعنی گیج شدم - اما اگه مثالی هم نداری خاصیت، متد، ویژگی مربوطه رو هم بگی خیلی عالیه.
از توجهت ممنونم
:11::11::11::11::11::11::11::11::11::11::11::11::1 1:

VDeveloper
07-05-2008, 00:40
رویداد OnConnect مربوط به IdTCPServer را نگاه کن و به پارامتری که داره دقت کن.

موفق باشی

MAR_Programmer
08-05-2008, 11:57
رویداد OnConnect مربوط به IdTCPServer را نگاه کن و به پارامتری که داره دقت کن.

موفق باشی

عزیز من دوتا تایپیک بالا تر گفتم که من از Thread استفاده کردم اما نمی دونم از کدوم یکی از پارامترهای اون (متد، خاصیت ها) باید استفاده کنم اگه ممکنه یکم واضح تر بگو
:13::13::13::13::13::13::13:

MAR_Programmer
08-05-2008, 12:05
یه چیز دیگه که یادم رفت بگم
مشکلم اینه که وقتی می خوام یه پیام عمومی بفرستم نمی دونم ( یعنی یه راه ساده می خوام) چه کار باید بکنم
تو همون رویدادی که گفتی من با یه StringList تمام IP هایی رو که متصل شدن رو ذخیره می کنم اما حالا چه جوری باید به کلاینت هایی که IP اونا رو ذخیره کردم یه پیام عمومی بفرستم با استفاده از Id..Server
یه راهش اینه که برای هر کلاینت کامپوننت Id..Server رو بزارم و برای سرور هم Id..Client بعد اینارو یکی یکی مقدار دهی کنم (خیلی سخته و طولانی میشه یه جورایی هم بهینه نیست) حالا اگه راه دیگه ای به نظرت میرسه خوشحال میشم که بگی.
بازهم از توجهت ممنون


:11::11:

romixery
09-05-2008, 12:25
دوست عزيز يه راه ديگه هم براي پيغام فرستادن هست. استفاده از كامپوننتهاي TClientScket و TServersocket هست. من با اين دو كامپوننت كار كاردم و به راحتي مي توني يه پيغام متني رو بفرستي. البته اين كامپوننتها به طور پيش فرض در دلفي 7 به بعد حذف شده اند چون Indy اومده بود. ولي اگه بخواي مي توني دستي وارد كني.
براي وارد كردنش هم مراحل زير رو برو:
Commponent>Install Pakages>Add
حالا فلد Bin دلفي را باز كن و فايل dclsockets70 را وارد ليست كامپوننتهات بكن. در Tab اينترنت نگاهي بكن. اومدن اونجا. توي delphi.about مراحل كامل ساخت برنامه اي كه ميخواي رو با اين دو كامپوننت گفته.
اينم صفحش:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
موفق باشي

MAR_Programmer
10-05-2008, 09:38
سلام
خیلی ممنون

VDeveloper
10-05-2008, 15:43
عزیز من دوتا تایپیک بالا تر گفتم که من از Thread استفاده کردم اما نمی دونم از کدوم یکی از پارامترهای اون (متد، خاصیت ها) باید استفاده کنم اگه ممکنه یکم واضح تر بگو
اون رویداد همش یک پارامتر بیشتر نداره!! دیگه من چی رو توضیح بدم؟!


تو همون رویدادی که گفتی من با یه StringList تمام IP هایی رو که متصل شدن رو ذخیره می کنم اما حالا چه جوری باید به کلاینت هایی که IP اونا رو ذخیره کردم یه پیام عمومی بفرستم با استفاده از Id..Server
یه راهش اینه که برای هر کلاینت کامپوننت Id..Server رو بزارم و برای سرور هم Id..Client بعد اینارو یکی یکی مقدار دهی کنم (خیلی سخته و طولانی میشه یه جورایی هم بهینه نیست) حالا اگه راه دیگه ای به نظرت میرسه خوشحال میشم که بگی.
از کجا فهمیدید که بهینه نیست؟! مکانیزم Indy با مکانیزم کنترل های دیگه فرق میکنه. Server شما فقط میتونه به درخواست های کلاینت ها پاسخ بده. اگر خودش بدون اینکه کلاینتی ازش چیزی خواسته باشه، بخواد به یک کلاینت پیامی بفرسته، این دیگه سرور نیست، بلکه خودش کلاینت هست! پس برای همچین اموری باید از IdTcpClient استفاده کرد و از IdTcpServer فقط برای امور مربوط به سرور. این روش غیربهینه ایی نیست، اتفاقا درست هم هست، اما چون بهش عادت ندارید، فکر می کنید که همونی که بهش عادت دارید درست هست!

MAR_Programmer
11-05-2008, 06:11
اون رویداد همش یک پارامتر بیشتر نداره!! دیگه من چی رو توضیح بدم؟!


اول اینکه Thread یه رویداد نبود بلکه یه خصوصیت بود از کلاس TIdPeerThread مثل همون پارامتر ارسال شده به رویداد OnConnect توی Id..Server و این کلاس یه عالمه خصوصیت و رویداد دیگه داره که خیلی از اونا به درد من نمی خوره



از کجا فهمیدید که بهینه نیست؟! مکانیزم Indy با مکانیزم کنترل های دیگه فرق میکنه. Server شما فقط میتونه به درخواست های کلاینت ها پاسخ بده. اگر خودش بدون اینکه کلاینتی ازش چیزی خواسته باشه، بخواد به یک کلاینت پیامی بفرسته، این دیگه سرور نیست، بلکه خودش کلاینت هست! پس برای همچین اموری باید از IdTcpClient استفاده کرد و از IdTcpServer فقط برای امور مربوط به سرور. این روش غیربهینه ایی نیست، اتفاقا درست هم هست، اما چون بهش عادت ندارید، فکر می کنید که همونی که بهش عادت دارید درست هست!

بهینه نیست چون خود من (چون تجربه کاری من توی این زمینه کمتره) باید این قسمت از برنامه رو بنویسم در ضمن دوست خوبمون توی تایپیک قبلی یه کامپوننت باحال گفت که هنوز امتحان نکردم ولی فکر می کنم جالب باشه

اگر در مورد کامپوننت های Socket نظر خاصی داری خوشحال میشم بهم بگی در ضمن یه سوال هم برام پیش اومد
اگر از SocketServer استفاده کنم تمام Socket های سیستم رو می تونم کنترل کنم منظور من اینه که Socket همون شماره Port توی Id..Server هستش دیگه نه؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
بازم از توجهتون ممنون

VDeveloper
12-05-2008, 02:08
اول اینکه Thread یه رویداد نبود بلکه یه خصوصیت بود از کلاس TIdPeerThread مثل همون پارامتر ارسال شده به رویداد OnConnect توی Id..Server و این کلاس یه عالمه خصوصیت و رویداد دیگه داره که خیلی از اونا به درد من نمی خوره

شما ظاهرا برداشت درستی از پارامتر، خصوصیت و... ندارید!
پارامتر مقداری هست که به یک تابع یا متد پاس داده میشه. رویدادها در دلفی بصورت "متدی از یک شی" تعریف میشند. وقتی گفته میشه اون رویداد فقط یک پارامتر داره، یعنی فقط یک مقدار به آن پاس داده میشه. اون مقدار هم برای رویداد OnConnect پارامتر Thread از نوع TIdPeerThread هست.
شما از من خواستید که پارامترهای آن را توضیح بدم، من هم گفتم فقط یک پارامتر داره.

خصوصیت یا Property داده ایی هست که یک کلاس بر می گردونه. کلاس TIdPeerThread خصوصیات مختلفی داره که همگی در راهنمای Indy شرح داده شدند. اسمشون هم گویا کارشون هست.


بهینه نیست چون خود من (چون تجربه کاری من توی این زمینه کمتره) باید این قسمت از برنامه رو بنویسم
بهینه بودن این نیست که شما کدی ننویسید! بهینه بودن یک کد یعنی با کمترین منابع مورد نیاز سریعترین کد ممکن بدست بیاد. این کد باید منطق خوب و قابل فهمی هم داشته باشه. این که شما فکر می کنید اگر برای چیزی کد بنویسید، یعنی بهینه نیست؛ تفکری هست که از VB با خودتون به دلفی آوردید و بعدا شما را دچار مشکل میکنه.


دوست خوبمون توی تایپیک قبلی یه کامپوننت باحال گفت که هنوز امتحان نکردم ولی فکر می کنم جالب باشه
توسعه اون کامپوننت بعد از دلفی 6 متوقف شده و دارای باگ هایی هم هست. کلا اون کامپوننت دربرابر Indy حرفی برای گفتن نداشت، برای همین هم از نسخه 7 به بعد Indy جایگزین آن شد. البته برای شما که بهینه بودن مساوی هست با راحت طلبی، همون کامپوننت کفایت میکنه.
بهتون پیشنهاد می کنم که سراغ دات نت و VB.Net برید. اونجا هم با شرایط VB بیشتر سازگار هست، هم اونقدر کلاس و کد آماده وجود داره که شما مجبور نباشید خودتون رو درگیر جزئیات فنی کنید.

MAR_Programmer
14-05-2008, 05:55
شما ظاهرا برداشت درستی از پارامتر، خصوصیت و... ندارید!
پارامتر مقداری هست که به یک تابع یا متد پاس داده میشه. رویدادها در دلفی بصورت "متدی از یک شی" تعریف میشند. وقتی گفته میشه اون رویداد فقط یک پارامتر داره، یعنی فقط یک مقدار به آن پاس داده میشه. اون مقدار هم برای رویداد OnConnect پارامتر Thread از نوع TIdPeerThread هست.
شما از من خواستید که پارامترهای آن را توضیح بدم، من هم گفتم فقط یک پارامتر داره.

متاسفانه من منظور خودم رو خوب بیان نکردم من کاملا می دونم که به یک پروسجور - function, Procedure - میشه هر نوع داده - Object, Record, Class, Data - رو فرستاد منظور من این بود که مثلا کلاس TStringList رو در نظر بگیرد این کلاس خصوصیتی داره به نام Count که تعداد خطوط (سطر های موجود در آن) رو نشون میده TStringList.Count می خواستم بدونم که پارامتر Thread یه همچین چیزی داره یا نه؟؟؟؟؟



خصوصیت یا Property داده ایی هست که یک کلاس بر می گردونه. کلاس TIdPeerThread خصوصیات مختلفی داره که همگی در راهنمای Indy شرح داده شدند. اسمشون هم گویا کارشون هست.

بازهم ببخشید من که چیز زیادی دستگیرم نشد که نشد، خیلی گشتم شاید Help دلفی من کامل نیست!!!! در هر صورت من که چیزی پیدا نکردم اما ممنون



بهینه بودن این نیست که شما کدی ننویسید! بهینه بودن یک کد یعنی با کمترین منابع مورد نیاز سریعترین کد ممکن بدست بیاد. این کد باید منطق خوب و قابل فهمی هم داشته باشه. این که شما فکر می کنید اگر برای چیزی کد بنویسید، یعنی بهینه نیست؛ تفکری هست که از VB با خودتون به دلفی آوردید و بعدا شما را دچار مشکل میکنه.

در مورد بهینه بودن منظور من هم اینه که اگه خود برنامه چنین حالتی رو به صورت پیش فرض داشته باشه هم کار من راحت تر میشه هم اینکه منابع و کد کمتری مصرف میشه در این مورد کاملا حق باشماست. اما در مورد VB شما از کجا فهمیدید یا نتیجه گرفتید که من قبلا VB کار بودم، چون اولا من هرگز با VB - یکم قبلا کار کردم - به صورت حرفه ای کار نکردم دوم اینکه من به شدت از VB منتفرم چراشم به خاطر اینکه خیلی سطح پایین بود - این به خاطر فعالیت های اولیه من روی اونه و بیشتر از اون هم جلو نرفتم چون بعدش با VC++ یهکم کار کردم و بعد با دلفی.



توسعه اون کامپوننت بعد از دلفی 6 متوقف شده و دارای باگ هایی هم هست. کلا اون کامپوننت دربرابر Indy حرفی برای گفتن نداشت، برای همین هم از نسخه 7 به بعد Indy جایگزین آن شد. البته برای شما که بهینه بودن مساوی هست با راحت طلبی، همون کامپوننت کفایت میکنه.
بهتون پیشنهاد می کنم که سراغ دات نت و VB.Net برید. اونجا هم با شرایط VB بیشتر سازگار هست، هم اونقدر کلاس و کد آماده وجود داره که شما مجبور نباشید خودتون رو درگیر جزئیات فنی کنید.

در این مورد هم نظری ندارم چون باهاش زیاد کار نکردم و رفتم سر همون کار قبلی تقریبا بهینه شد و حالا با چندا حقله و چیزای دیگه درستش کردم - تا الان که خوب کار می کرد - در مورد این تایپیک هم من فکر می کنم اگر توضیح دیگه ای برای این آماتور نمانده بهتره که همینجا تمومش کنیم.
بازم از اینکه وقت گذاشتی و جواب دادی خیلی خیلی ممنون
یه چیز دیگه این شکلک های بقل متن کار نمی کنه چرا؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

VDeveloper
15-05-2008, 02:55
مثلا کلاس TStringList رو در نظر بگیرد این کلاس خصوصیتی داره به نام Count که تعداد خطوط (سطر های موجود در آن) رو نشون میده TStringList.Count می خواستم بدونم که پارامتر Thread یه همچین چیزی داره یا نه؟
نه TIdPeerThread خودش خصوصیت Count نداره، چون معرف فقط یک Thread هست، نه لیستی از کلاینت های متصل شده به سرور. اگر می خواید لیستی از کلاینت های متصل شده به سرور داشته باشید، باید خودتون یک لیست درست کنید و هر زمان که کلاینتی به سرور متصل شد، در رویداد OnConnect سرور، پارامتر AThread را که از نوع TIdPeerThread هست، به لیست اضافه کنید، و هر زمان که کلاینتی از سرور جدا شد، در رویداد OnDisconnect سرور Thread آن کلاینت را از لیست حذف کنید. به این ترتیب، لیست شما شامل لیستی از Threadهای مرتبط با هر کلاینت میشه.
هر کدام از این Thread ها از نوع TIdPeerThread هستند. این کلاس خصوصیتی داره به نام Connection که می تونید از طریق اون، هم نام کامپیوتر کلاینت را بدست بیارید، هم از طریق متدهای آن، مثل متد Write، برای کلاینت پیام ارسال کنید.


من که چیز زیادی دستگیرم نشد که نشد، خیلی گشتم شاید Help دلفی من کامل نیست!!!! در هر صورت من که چیزی پیدا نکردم
معمولا باز کردن Help دلفی و جستجو کردن در آن، به نتیجه مورد نظر نمیرسه. بهترین راه اینه که در Object Inspector روی رویداد OnConnect کلیک کنید و بعد کلید F1 را بزنید. این کار شما را مستقیما به صفحه راهنمای مربوط به رویداد OnConnect می برد. در اونجا TIdPeerThread بصورت لینک مشخص هست، با کلیک بر روی آن، به صفحه مربوط به کلاس TIdPeerThread میرید.