PDA

View Full Version : آموزش: Tabriz Messenger



taghvajou
پنج شنبه 06 خرداد 1389, 17:44 عصر
با نام و توکل به خدای متعال، تاپیک تمرین و پروژه مسنجر بچه های تبریز رو در راستای تاپیک:
http://barnamenevis.org/forum/showthread.php?t=217776

با همکاری همه دوستای برنامه نویس مون شروع میکنیم. برای آشنایی بیشتر، ترجیحا یه بار با حوصله پیامهای تاپیک بالا رو مرور بکنیم.

علیرضا حسن زاده
پنج شنبه 06 خرداد 1389, 17:58 عصر
خوب دوست عزیز taghvajou (http://barnamenevis.org/forum/member.php?u=69359) جریان چه جوری شد؟ ریموت دسکتاپ رو کار کنیم مسنجر رو البته اگه ریموت دسکتاپ رو کار کنیم همون کار رو به صورت پیشرفته رو انجام دادیم حالا استارت بزنین که شروع کنیم اگر هم دوستان برنامه آماده ای دارن در این زمینه (تو #C باشه بهتره به نظر من) میشه از اون هم کمک گرفت تا یه برنامه خوب درست کنیم

taghvajou
پنج شنبه 06 خرداد 1389, 19:28 عصر
در واقع منظورمون تبادل متن، صوت، تصویره و فیلمه! اسمش رو هر چی بخوایم میشه گذاشت!
به اضافه یه سری امکانات اضافی مثل جمع کردن بقیه آی ام ها و ...
بازهم ایده های دیگه مون رو به مرور اضافه میکنیم. پس فعلا میریم تو کار!

در مورد اینترفیس یه سوال! میشه دو جور برنامه رو در نظرگرفت:
1- برنامه دو قسمت داشته باشه: کلاینت به صورت دسکتاپ اپلیکیشن و سرور که میشه یه ویندوز سرویس یا وب سرویس باشه
2- همه چی سرورساید باشه و کاملا تحت وب!

که با توجه به هدفهای آتی برنامه مون برای ریموت و سوکت، و نیز محدودیت های براوزها و وب اپلیکشن ها در دسترسی به سیستم و ای پی آی ها، بهتره گزینه یک رو انتخاب کرد.

ضمنا
در مورد نحوه تبادل اطلاعات هم دو راه داریم:

1- همه پاکتهامون با فلگ تو پایگاه داده ذخیره بشن!
2- اطلاعات فقط تو رم سرور باشن و سرویس با گوش دادن پیامها، تبادل کنه!

که برای سهولت کار تو قدم اول پیشنهاد میکنم اول از گزینه اول استفاده کنیم.

علیرضا حسن زاده
جمعه 07 خرداد 1389, 01:07 صبح
دوستان عزیز من اگه برنامه حتمی باشه و نتیجه بخش، می تونم تو VPS خودم امکانات دیتابیس و ... رو بدم (البته اگه نتیجه بخش باشه)

battak
جمعه 07 خرداد 1389, 10:52 صبح
سلام :قلب:،
من امروز این تاپیک رو دیدم.
خب مهندسین گرامی، از دست ما چه کاری بر میاد؟

علیرضا حسن زاده
جمعه 07 خرداد 1389, 18:52 عصر
با Desktop بودن برنامه موافقم بهتر میشه توسعش داد

این تاپیک مثل اینکه نمی خواد راه بیفته؟:اشتباه:

battak
دوشنبه 10 خرداد 1389, 11:36 صبح
من اگه میدونستم اومدنمون به این سمت بچه ها رو فراری میده، هیچ وقت این پیشنهادو نمیدادم!! :ناراحت:

taghvajou
دوشنبه 10 خرداد 1389, 11:55 صبح
سلام به همه
داش آتان عزیز! کسی فراری داده نشده!

همه هستیم. فقط یه کمی سرمون شلوغه! انتظار ندارین که دوستا کار و زندگیشون رو تعطیل کنند و بشینند پای این تاپیک. آهسته و پیوسته!
شما نگران نباش. ما واسه شروع یه سری هماهنگی های اولیه و مرتب سازی هایی نیاز داریم که به مرور انجام میشه!

مثلا بذار ببینیم علیرضا دیتابیس بهمون میده یا مثلا خودمون یه کاری کنیم (البته بنده هم میتونم دیتا بیس تحت وب بدم)

اصلا دلسرد نشین.

البته یه پیشنهادی هم دارم اینکه هر مطلبی که تو این تاپیک گذاشته شد، خبرش رو هم تو تاپیک تبریزیها بذاریم تا اطلاع رسانی بشه.

خوب! ممنون

برگردیم سر اصل مطلب:

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

فقط یه سوال از دوستا!
آیا یه چیزی اولیه درست کنیم بذاریم اینجا یا اینکه
تمام مراحل کار رو اینجا مو به مو بنویسیم و هر کس کد خودشو بنویسه
یا اینکه یا سورس کنترل راه اندازی کنیم؟

علیرضا حسن زاده
دوشنبه 10 خرداد 1389, 12:30 عصر
مثلا بذار ببینیم علیرضا دیتابیس بهمون میده یا مثلا خودمون یه کاری کنیم (البته بنده هم میتونم دیتا بیس تحت وب بدم)من کی خودمو کنار کشیدم در حد توان هر کمکی از دستم بربیاد انجام می دم


آیا یه چیزی اولیه درست کنیم بذاریم اینجا یا اینکهبه نظر من بهتره یه طرح کلی از برنامه ای می خوایم کار کنیم رو ارائه بدیم بعد رو قسمت های مختلف اون کار کنیم ولی اینکه طرح کلی برنامه مشخص باشه خیلی بهتره اینطوری امکان اضافه کردن خصوصیات جدید هم با در نظر گرفتن آینده برنامه در طرح کلی، هم آسون تر میشه خلاصه برنامه رو یه تجزیه تحلیل بکنیم

taghvajou
دوشنبه 10 خرداد 1389, 12:56 عصر
خوب میشه یه توضیح بگی، منظورت رو از طرح کلی نفهمیدم. یعنی یه چیزی بیشتر از اونچه که تا حالا گفته شده و جمع بندی شده؟

battak
دوشنبه 10 خرداد 1389, 12:57 عصر
آیا یه چیزی اولیه درست کنیم بذاریم اینجا یا اینکه
تمام مراحل کار رو اینجا مو به مو بنویسیم و هر کس کد خودشو بنویسه
یا اینکه یا سورس کنترل راه اندازی کنیم؟

به نظر من که چون ماها هنوز هیچی بلد نیستیم، برامون مسلما" خوبه که مو به مو باشه که بدونیم چی به چی هست! البته اگه حوصله دوستان رو سر نمیبره!!

taghvajou
دوشنبه 10 خرداد 1389, 13:02 عصر
به نظر من که چون ماها هنوز هیچی بلد نیستیم

هیچی یعنی چقدر؟ یعنی تازه کار تازه کار در حد آشنایی با سینتکس سی شارپ یا نه مثلا پروژه بزرگ کار نکردین؟

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

علیرضا حسن زاده
دوشنبه 10 خرداد 1389, 13:06 عصر
خوب میشه یه توضیح بگی، منظورت رو از طرح کلی نفهمیدم. یعنی یه چیزی بیشتر از اونچه که تا حالا گفته شده و جمع بندی شده؟
تا جایی که من یادمه فعلا هیچ طرحی از برنامه وجود نداره یعنی معلوم نیست که چیه فقط یه برنامه هست که به صورت کلاینت/سرور عمل میکنه
خوب باید بیایم رو پروتکل هایی که می خوایم از اونها استفاده کنیم و نوع برنامه نویسی و... رو مشخص کنیم در صورت امکان یه مرجعی هم برای اونایی که مباحث رو در این زمینه بلد نیستن و می خوایم از اونها در برنامه استفاده کنیم، معرفی کنیم تا با مطالعه اونها (در صورت علاقه داشتن) بهتر بتونن در ادامه برنامه رو تعقیب کنن این جوری مشخص میشه که هدف و مسیر برنامه چیه و دیگرانی هم که میان تو تاپیک با مطالعه پستها و مراجع می تونن به جمع ملحق بشن (بالاخره کار گروهیه دیگه همه که در یک سطح نیست بخصوص که هیچ اشنایی از سوابق همدیگه نداریم:متفکر:)

taghvajou
دوشنبه 10 خرداد 1389, 13:13 عصر
ممنون میشم که در مورد این کلیت خودت یه چیزهایی رو بگی تا اگه به ذهنمون رسید تکمیل کنیم.

علیرضا حسن زاده
دوشنبه 10 خرداد 1389, 13:30 عصر
ممنون میشم که در مورد این کلیت خودت یه چیزهایی رو بگی تا اگه به ذهنمون رسید تکمیل کنیم.
اگه طرف سوالتون من بودم باید خدمتتون عرض کنم که اگه بخوایم برنامه رو به صورت کلاینت/سرور پیاده سازی کنیم روش های مختلفی وجود داره مثلا مسنجر ها یا برنامه هایی مثل RemoteDesktop هرکدوم از پروتکل های خاصی پیروی می کنن که تو RFC ها توضیح داده شده (البته به صورتی که یه برنامه که بخواد چنین کاری رو انجام بده چه چیزهایی رو باید رعایت کنه و موارد دیگه) در این مسیر اگه پیش بریم برنامه بصورت تقریبا پیشرفته عمل میکنه و بنده هم مطالعه و بحث در این موارد و پیاده سازی اونها مد نظرم بود و همچین معرفی مراجعی در این مورد برای دوستانی که می خوان با هم همراه باشیم البته روش دیگه ای هم وجود داره که مثل پروژه های دانشجویی ساده شروع کنیم به کار با TCP به صورت خیلی مبتدی و یه پورت رو باز کنیم و یه تکست بفرستیم و ... سرور به پورت گوش کنه و پیام رو نشون بده و بقیه ماجرا البته کلیتش فرقی نمیکنه ولی تو ریز کار خیلی با هم فرق دارن ازلحاظ امنیت، کارایی و...

برای مثال این RFC ها رو یه نگاهی بکنین:

http://www.faqs.org/rfcs/rfc3994.html
http://www.faqs.org/rfcs/rfc3922.html

کار ساخت یافته و اصولی باشه بهتر نیست؟

Saeed_m_Farid
سه شنبه 11 خرداد 1389, 12:24 عصر
در واقع منظورمون تبادل متن، صوت، تصویره و فیلمه! اسمش رو هر چی بخوایم میشه گذاشت!
به اضافه یه سری امکانات اضافی مثل جمع کردن بقیه آی ام ها و ...

فکر نمی کنید یکمی قدم اول رو بزرگ برداشتید؟ میگم ببینید میشه با همین برنامه مثلاً DNA شبیه سازی کنیم و یه جورایی خودمون هم تبادل (انتقال اجسام) کنیم؟:بامزه:
جدا از شوخی، تبادل متن یه بحث هست و تبادل صوت و تصویر یه بحث دیگه و کلاً از پایه با هم تفاوت می کند؛ بنظر من چون C#‎‎ انتخاب کردین، ماهیت Managed زبونهای دات نت باعث میشه خیلی ها دیگه زیاد درگیر پروتکل های سطح پایین تر نشن و همونطورکه میدونید تو انتقال صوت و تصویر شما شدیداً درگیر پروتکل ها و کدک ها هستید و باید امکاناتی به مدیر یا توسعه دهنده سیستم برای رهگیری پکت ها بدین، هم برای سیگنالینگ و هم برای مدیا؛ واقعیت اش فکر نمیکنم با 3-4 تا متخصص اینکار که هم به مفاهیم مخابراتی آشنا باشند هم به برنامه نویسی، بشه چنین سروری حتی برای شروع توسعه داد.
اگه نظر من رو می پرسید، اول روی برنامه های سرور/کلاینت برای چت ساده و توضیحات قسمتهای مختلف برای همراه کردن بچه ها با هم وقت بذاریم، تا دوستانی که از پروتکل، RFC ها و مفاهیم اولیه ارتباط اطلاعی ندارند یا میخوان با برنامه نویسی کلاینت/سرور آشنا بشن هم یه حرکتی بکنند و بعد برای صوت و تصویر از سیستم های سورس باز استفاده کنیم و براشون کلاینت و plug-in و ... یا برنامه هایی برای پیکربندی شون، رابط کاربری فارسی، و هزار تا کمبود دیگه که الان به چشم میخوره، بنویسیم؛ چون تو همین زمینه هم واقعاً متخصص و برنامه کم داریم و نیاز شدید!
همین که یکی بدونه SIP، IAX، H.323 و یا Skinny چی هستند و معمولاً رو چه پورتی کار می کنند یا چطوری پیکربندی میشن و اکستنشن ها شون چخ معنی دارن، چه جوری میشه اونها رو به هم ارتباط داد و ... یا کدکهای صوتی/تصویری مثل G.711، G.729، iLBC و ... یا H.264 و 263 و سایر کدک های تصویری رو بشناسه و نحوه استفاده از اونها رو بدونه خودش خیلی حرفه و قبل از پیاده سازی سرویس دهنده برای اونها، باید نحوه کارکرد و مفاهیم رو شناخت.
ضمناً تبادل داده یادتون رفت.

2- همه چی سرورساید باشه و کاملا تحت وب!
عمراً :لبخند:
من همونطورکه قول دادم از پست بعد شروع میکنم به کدنویسی و توضیحات، اگه اجازه بدین ...

taghvajou
سه شنبه 11 خرداد 1389, 12:37 عصر
من همونطورکه قول دادم از پست بعد شروع میکنم به کدنویسی و توضیحات، اگه اجازه بدین ...

مارکو جان، قبول شروع کنیم ولی اول بگو که تبادل کدهامون چطور باشه:
1- کد بنویسیم و سورس هارو بذاریم اینجا و کلیات کاری که انجام شده رو اینجا بنویسیم.
2- تمام مراحل و کارهامون رو جز به جز اینجا بیان کنیم.
3- کدهارو تو یه سامانه سورس کنترلینگ بذاریم و اینجا کلیاتش رو بگیم.

دوم) قبل از کدهامون بیا اول دیتابیسمون رو تهیه کنیم و بدیم علیرضا آپلود کنه

من میگم یه پایگاه داده داشته باشیم تو وب، تمام پیامهامون رو تو اون ذخیره کنیم با جزئیاتش،مثل آیدی گیرنده، فرستنده، زمان، متن و ... و فلگ استاتوسش.
بعد یه ترد یا تایمر تو کلاینتمون داشته باشیم که بره از پایگاه داده چک کنه که آیا پیامی واسه این کاربر وجود داره بیاره و نمایش بده و نیز آیا کاربر پیامی تو برنامه کلاینت وارد کرده باشه اون رو به سرور ببره و ذخیره کنه!

خیلی ساده! واسه شروع!

بعد بریم تو پورتها!


من همونطورکه قول دادم از پست بعد شروع میکنم به کدنویسی و توضیحات، اگه اجازه بدین ...

مارکو جان، قبول شروع کنیم ولی اول بگو که تبادل کدهامون چطور باشه:
1- کد بنویسیم و سورس هارو بذاریم اینجا و کلیات کاری که انجام شده رو اینجا بنویسیم.
2- تمام مراحل و کارهامون رو جز به جز اینجا بیان کنیم.
3- کدهارو تو یه سامانه سورس کنترلینگ بذاریم و اینجا کلیاتش رو بگیم.

دوم) قبل از کدهامون بیا اول دیتابیسمون رو تهیه کنیم و بدیم علیرضا آپلود کنه

Saeed_m_Farid
سه شنبه 11 خرداد 1389, 13:20 عصر
2- تمام مراحل و کارهامون رو جز به جز اینجا بیان کنیم.

من با این موافقم، دلیلش هم اینه که درگیر مسایل دیگه مثل پایگاه داده، وضعیت فعلی اینترنت، هزینه های جانبی و از همه مهمتر منحرف شدن هدف که آموزشی هست نشیم؛ من با شناختی که از اونیکی تاپیک داشتم، احساس می کنم هدف دوستان شروع هست نه اینکه یه پروژه رو بصورت کامل به مرحله توسعه نجاری برسونند ...
اگه بعداً خواستیم میتونیم با همین دوستان که تو مراحل پروژه همراهی کردن و البته استفاده از پیشنهادات و امکاناتی که اسپانسر! های عزیز دراختیار میذارن وارد فازهای پروژه قابل عرضه بشیم ...
البته دوستان دیگه اگه نظری دارن بگن؛ بنده تابع جمع هستم ...

من میگم یه پایگاه داده داشته باشیم تو وب، تمام پیامهامون رو تو اون ذخیره کنیم با جزئیاتش،مثل آیدی گیرنده، فرستنده، زمان، متن و ... و فلگ استاتوسش.
بعد یه ترد یا تایمر تو کلاینتمون داشته باشیم که بره از پایگاه داده چک کنه که آیا پیامی واسه این کاربر وجود داره بیاره و نمایش بده و نیز آیا کاربر پیامی تو برنامه کلاینت وارد کرده باشه اون رو به سرور ببره و ذخیره کنه!

خیلی ساده! واسه شروع!

بعد بریم تو پورتها!
اولاً که "خیلی ساده! واسه شروع!" از نظر شماست، چون باید بچه ها رو درگیر بانک اطلاعاتی، ترنزکشنها و مدیریت صحیح منابع هم بکنیم که فکر کنم باعث پراکندگی پروژه و اظهار نظرات مختلف و ... میشه.
ضمناً مدیریت منابعی که Alireza_1363 در اختیار قرار میده رو کی عهده دار میشه؟ سرور بیچاره رو موش آزمایشگاهی کنیم بعد یکی بیاد ببینه پورت هاش بازه و ... خطر داره حسن!

نظرتون چیه یه برنامه کلاینت/سرور چت رو که میدونیم کار میکنه مرحله به مرحله بریم جلو؟
نمونه اش رو ضمیمه می کنم؛ دوستانی که مایل هستند، دانلود کنند؛ بعد خودم - ودوستانی که مایل به بحث در موردش هستند- توضیح میدم و اگه نواقصی داشت یا مشکلی بود و ... همینجا ادامه اش بدیم تا برای دوستایی که از پایه (نه دیگه سینتکس C#‎‎‎) آشنایی کمی دارن یه تمرینی هم بشه. اگه OK هست، یکمی هم صبر می کنم تا دوستان دیگه نظرشونو بگن، بعد یا علی!

ضمناً این برنامه نمونه رو از لینک های زیر هم می تونید بگیرید :


Chat-Client (http://www.geekpedia.com/tutorial239_Csharp-Chat-Part-1---Building-the-Chat-Client.html)
Chat-Server (http://www.geekpedia.com/tutorial240_Csharp-Chat-Part-2---Building-the-Chat-Server.html)

علیرضا حسن زاده
سه شنبه 11 خرداد 1389, 15:52 عصر
نظرتون چیه یه برنامه کلاینت/سرور چت رو که میدونیم کار میکنه مرحله به مرحله بریم جلو؟
من هم تو تاپیک قبلی همین موضوع رو گفتم که رو یه برنامه آماده کار کنیم و توسعش بدیم ولی کسی نظری نداد ولی بهترین راه همینه بخصوص برای مبتدی هایی مثل من:خجالت:
راستی این جمعی که هی ازش دم میزنیم چند نفره فکر کنم 3 یا 4 نفریم که تو این تاپیک هستیم

مشکلی هم از بابت سرور نیست چون اولا VPS هست دوما فعلا من کار زیادی باهاش ندارم فقط همین طوری هزینه می دم
ضمنا برای مدیریت پایگاه داده کسایی که واقعا بخوان کار کنن یوزر&پسورد و IP/Port براشون PM می کنیم انشاالله که مشکلی پیش نمیاد

battak
چهارشنبه 12 خرداد 1389, 01:15 صبح
منم كه طبق معمول هستم و دارم دوستان رو همراهي ميكنم ولي چون نميدونم چي بايد بگم فقط خواستم بگم، موفق باشين و خسته نباشين :قلب:

taghvajou
چهارشنبه 12 خرداد 1389, 02:27 صبح
شب همه خوش
دیتابیس و طراحی و ساخت و تحت کنترل ساختن رو می تونم به عهده بگیرم.

shirin_sh1024
چهارشنبه 12 خرداد 1389, 02:49 صبح
سلام دوستان
راستش من آذری نیستم ولی این پروژه ای که دارید انجام میدین رو دنبال میکنم چون کار خیلی جالبیه امیدوارم خوب پیش بره.
فقط یه سئوالی برام پیش اومد بهتر نیست اول پروژه رو تحلیل کنید بعد برید سراغ پیاده سازی؟

taghvajou
چهارشنبه 12 خرداد 1389, 02:51 صبح
حضورتون رو به جمعمون خیر مقدم عرض میکنیم. فقط خواهشا آنچه که گذشته رو با دقت یه بار مرور کنین.

Saeed_m_Farid
چهارشنبه 12 خرداد 1389, 12:06 عصر
خوب با اجازه دوستان شروع می کنیم:
اول از قسمت سرویس دهنده که هسته سیستم هست، شروع کنیم تا برسیم به سرویس گیرنده ها؛ من میخوام از پایه شروع کنم و با اینکه میدونم خیلی از اساتید اینجا بهتر از من به مطالب مسلط هستند، ولی به تجربه فهمیدم که باید همه رو صفر فرض کرد تا بعداً دوباره کاری صورت نگیره.
همونطوریکه میدونید، مسئولیت یک سرویس دهنده "پیام فوری" اینه که تمام شرایط لازم برای ارتباطات متنی کلاینت هایی که بهش وصل میشن رو تامین کنه؛ برای فاز اول، ما این شرایط رو در موارد زیر خلاصه می کنیم :


مدیریت کاربران (حذف، اضافه)
مدیریت اتصال ها و پیغامها (قبول کردن، ارتباطات کاربران، مدیریت رشته ها)
ارتباط بین این دو (یعنی 1 و 2)

فعلاً به همین ها محدود می کنیم تا زیاد درگیر جزئیات نشیم؛ برای راه انداختن این حداقل ها، من فرض رو بر این میذارم که همه، سینتکس ها معمولی C#‎ و مفاهیم کلاس، عضو، private و public و ... (غیره در مورد کلاسها نه هر ... ای) رو میدونن؛ دیگه این کمترین انتظار هست، مواردی که زیاد هم پیچیده نیست و توضیح داده میشه مثلاً اینها هستند :


Events
Threads
delegate
Hashtable
StreamWriter , StreamReader
Listening
غیر از چک کردن Status دیگه چیزی به ذهنم نمیرسه

خوب، کلیات اینطوری هست که ما میخواهیم 3 تا کلاس درست کنیم به ترتیب برای :

مدیریت رخدادها = StatusChangedEventArgs (یکم قضیه این کلاس فرق میکنه!)
مدیریت کاربران و ارسال = ChatServer
دریافت پبغامها و مدیریت اتصال ها = Connection

اگه تا اینجا پیشنهاد/انتقاد/سوالی نیست ادامه بدیم؟

Saeed_m_Farid
پنج شنبه 13 خرداد 1389, 09:08 صبح
خواهشاً حوصله دوستان سرنره، سعی خواهد شد تو این پست همه چیز از صفر گفته بشه و پس از این پست در هر مرحله، درصورت نیاز مفاهیمی که ممکنه کمتر به گوش خورده باشن، تا اونجایی که سوادمون قد میده توضیح داده بشن. توضیح که میگم نه اینکه مثلاً Threading رو کاملاً باز کنیم یا رخدادها و Delegate ها رو از صفر توضیح بدیم تا جزئیات؛ کاری که می کنیم اینه که توضیحی مرتبط با کاربرد این موارد در پروژه موردنظرمون بدیم و برای توضیحات بیشتر از آموزشهای اساتید تو همین فروم و سایر مراجع استفاده بشه. ضمناً اگه نکته یا ترفندی تو جایی بنظر رسید از ذکرش دریغ نکنیم ...
********************
اول که باید ویژوال استودیو رو اجرا کنید! می تونید تو Run بنویسید devenv و محیط رو بالا بیارید.
یه پروژه جدید WindowsFormsApplication باز کنید. طبق گفته های پست قبل نسبت به نیازهامون باید namespace های (معنیش رو نمی دونید هم مهم نیست، همون جملات) زیر رو به using های خودتون اضافه کنید(برای رفتن از فرم به کد از F7 و برعکسش از Shift+F7 می تونید استفاده کنید):

System.Threading;
System.Net;
System.Net.Sockets;
System.IO;


حالا رو فرمتون از Toolbox ویژوال استودیو (Ctrl+W بعد X بزنید) دوتا Textbox بندازین و در پنجره Properties ا(Ctrl+W بعد P بزنید) اسامی شون - خاصیت Name - رو به txtIp و txtLog تغییر بدین و خاصیت Multiline کنترل txtLog رو True کنید. حالا یه Button و Lable هم رو فرمتون بندازید و Name شون رو به ترتیب بذارید btnListen و lbIp؛ ضمناً Text شون رو هم به همون ترتیب بذارید Start Listening و IP Address: در نهایت نام فرم رو frmChatSrv و Text اش رو Chat Server بذارید. با مرتب کردن جاهاشون فرم تون تقریباً میشه یه چیزی مثل فرم زیر
http://www.geekpedia.com/Pictures/ChatClientAndServer/ChatServerForm.png

اینکه تاکید روی اسامی و Textهای (و در مراحل بعد کامنت ها) معنی دار میشه، دلیلش اینه که نشاندهنده درک درست شما از کدنویسی هست، یعنی پیش هرکسی برید برای بررسی کدهاتون، اولش به اینها توجه میکنن و اگه مثلاً Button1 تا Texbox1 تو کدتون دیده بشه (به هردلیل) نشان دهنده آشغال! بودن کدتون هست و به بقیه موارد توجه نمیشه، بلاتشبیه یه چیزی مثل نماز برای مسلمونا! حالا خود دانید ...
این تمام کاری بود که ما با رابط کاربری سرویس دهنده مون داشتیم؛ بقیه مربوط میشه به کد پشت زمینه که اصل کاری هست. خودتون رو آماده کنید و اگه کلمات عجیب-غریب دیدین فرار نکنید، به تدریج توضیح داده میشن و امیدوارم دوستان دیگه هم اشکالات رو تذکر بدن :
تو بخش کد داخل کلاس فرمتون کد زیر رو اضافه کنید :
private delegate void UpdateStatusCallback(string strMessage);
اینکه این کد چیه و کاربردش چیست و ... بعداً توضیح داده میشه، چون قبلش چند تا مورد هست که باید پیش زمینه اش رو داشته باشید؛ الان فقط میخواهیم فرممون رو تکمیل کنیم و بعدش بریم سراغ مفاهیم. حالا روی btnListen دابل کلیک کرده و کدهای زیر رو اضافه کنید :
// Parse the server's IP address out of the TextBox
IPAddress ipAddr = IPAddress.Parse(txtIp.Text);
// Create a new instance of the ChatServer object
ChatServer mainServer = new ChatServer(ipAddr);
// Hook the StatusChanged event handler to mainServer_StatusChanged
ChatServer.StatusChanged += new StatusChangedEventHandler(mainServer_StatusChanged );
// Start listening for connections
mainServer.StartListening();
// Show that we started to listen for connections
txtLog.AppendText("Monitoring for connections...\r\n");

حالا با دو تا تابع زیر کار ما کلاً با این فرم تموم میشه و میریم سراغ توضیحات موارد و Keyword هایی که ممکنه کمی نامفهوم باشند :

public void mainServer_StatusChanged(object sender, StatusChangedEventArgs e)
{
// Call the method that updates the form
this.Invoke(new UpdateStatusCallback(this.UpdateStatus), new object[] { e.EventMessage });
}

private void UpdateStatus(string strMessage)
{
// Updates the log with the message
txtLog.AppendText(strMessage + "\r\n");
}

اگه تا اینجا، مورد مبهمی (غیر از داخل توابع) به ذهن دوستان نمیرسه، ادامه بدیم.

taghvajou
پنج شنبه 13 خرداد 1389, 10:32 صبح
فقط یه چیزی!
به نظر میاد فعلا نمیشه در مورد چیزی بحث کرد! در مورد متدها و اونت ها من نیاز به بحث می بینم تا تکمیل ترش کنیم. این یک.

دوم به نظر میاد تو فرم لودمون هم اتصالمون رو اول چک کنیم بعد ادامه!

من تا حالا با سوکت کاری نکردم. میشه به موقعش خوب برامون بکی.


مارکو! به نظرمیاد بعضی از دوستامون هنوز با بعضی از مفاهیم مثل ترد و دلیگیت آشنا نباشند، حواسمون باشه که حتما توضیح حداقلی هم براشون بذاریم.

ممنون ادامه بده ما هم هستیم و کمک میکنیم.:تشویق::تشویق::تشویق:: تشویق::تشویق::تشویق::تشویق::ت شویق:

Saeed_m_Farid
پنج شنبه 13 خرداد 1389, 11:20 صبح
مارکو! به نظرمیاد بعضی از دوستامون هنوز با بعضی از مفاهیم مثل ترد و دلیگیت آشنا نباشند، حواسمون باشه که حتما توضیح حداقلی هم براشون بذاریم.



فقط یه چیزی!
به نظر میاد فعلا نمیشه در مورد چیزی بحث کرد! در مورد متدها و اونت ها من نیاز به بحث می بینم تا تکمیل ترش کنیم. این یک.

دوم به نظر میاد تو فرم لودمون هم اتصالمون رو اول چک کنیم بعد ادامه!
شما هم رسماً اسم گذاشتید رو من: مارکو!
در پاسخ شما:

درصورت نیازمفاهیمی که ممکنه کمتر به گوش خورده باشن، تا اونجایی که سوادمون قد میده توضیح داده بشن.
...
مورد مبهمی (غیر از داخل توابع)

اگه کد پروژهء سرویس دهنده (ChatServer که تو پستهای قبل آپ کردم) رو ببینید، متوجه میشین که اکثر کارها تو یه namespace دیگه بنام ChatServer انجام میشه که همونطورکه قبلاً توضیج دادم، وظیفه داره : " تمام شرایط لازم برای ارتباطات متنی کلاینت هایی که بهش وصل میشن رو تامین کنه"؛ که "اتصالمون رو اول چک کنیم" هم یکی از وظایفش هست ...
هنوز به کلاسهای اون namespace نرسیدیم؛ اول قرار شد توضیح در مورد همین موارد بدیم تا برسیم به Core:لبخند: سرویس دهنده.

Saeed_m_Farid
پنج شنبه 13 خرداد 1389, 12:36 عصر
تو کد ذکر شده در اون پست! (http://www.barnamenevis.org/forum/showpost.php?p=1000976&postcount=33)، مواردی بود که عرض کردم باید پیش زمینه هایی در موردش داشته باشیم؛ این پیش زمینه ها شامل رخدادها، Delegate و دسترسی همزمان به عناصر فرم و سایر موارد که بعدها بهشون بازم برمیخوریم و بخاطر طولانی نشدن پست ها، بتدریج در موردشون بحث میشه. اینم بگم که تو این پست فعلاً از کد خبری نیست ...

************
همونطوریکه میدونید، قبل از اینکه برنامه های گرافیکی (GUI) با تعاملات این چنینی با کاربران ظهور کنند؛ برنامه هایی که می نوشتیم شروع میکردن به یک روند پشت سرهم و اگه قرار بود با کاربر تبادلی هم صورت بگیره، کاربر مرحله به مرحله و بسیار کنترل شده، بدون تعاملات همزمان، با برنامه ارتباط داشت؛ ولی الان قضیه کاملاً متحول شده. یعنی :


اولاً کاربر به طرق مختلف با ماوس/کیبرد و سایر ادوات ورودی با برنامه ارتباط داره (کلیدهای ترکیبی، دابل کلیک، حرکت های مختلف ماوس - Drag/Drop، حرکت از روی کنترلها و ... - پایین یا بالابودن وضعیت کلیدها و ...)
ثانیاً ممکنه با انتخابهای کاربر، روند تعامل عوض بشه (مثلاً با انتخاب منوها، دکمه های کشوئی و ... گزینه های روی فرم یا پشت صحنه عوض بشن) و خلاصه اش اینکه دیگه برنامه برای کاربر تصمیم نمیگیره و کاربران هستند که برنامه ها رو هدایت می کنند.
ثالثاً ممکنه چندین کاربر همزمان به نحوی با برنامه تعامل داشته باشند که بخواهند به منابعی از برنامه همزمان دسترسی پیدا کنند (مثلاً یک Textbox یا هرچیزی روی فرم، حافظه تخصیص یافته، توابع کاربردی و ...) که باید روشی برای مدیریت صحیح این موارد درنظر گرفته بشه.

بعنوان راه حل، روشی که استفاده میشه، عبارتست از Event-driven programming (http://en.wikipedia.org/wiki/Event-driven_programming) یعنی برنامه نویسی رویدادگرا؛ به این معنی که به هر عمل که از سوی کاربر انجام میگیره، یا تراکنش های دیگه سیستمی مثل اتفاقاتی که در بانک اطلاعاتی، سیگنالهای سیستمی (مثلاً تیک ساعت)، سیگنال-سیستم های مخابراتی، تراکنشهای شبکه و ... یک سری رویدادهایی انتساب پیدا می کنه که هر برنامه نسبت به رویدادی که منتظرش هست، عکس العمل نشون میده، یعنی درحقیقت برنامه ها مثل برده هایی هستند که فقط منتظر دستورات هستند و نسبت به رویدادهایی که بهشون حساس هستند عکس العمل نشون میدن.
حالا منظور از اینهمه سردرد چی بود؟ اینکه شما با دیدن Event ها، Delegateها، Callback، Backgroundworker و سایر مفاهیم سردردهای بدتر نگیرین، و فلسفه شون رو متوجه بشد؛ در C#‎‎‎‎‎ مفاهیم Event و Delegate بهم کاملاً گره خوردن، پس نمیشه بدون دونستن یکی، دیگری رو توضیح داد.
Events یا رویداد (رخداد) ها در C#‎‎‎‎ برای این تعریف میشن که اگر عملی اتفاق افتاد، این عمل باید توسط گرداننده ای (Handler) مدیریت بشه، وظیفه این Event handler در C#‎‎‎‎ معمولاً برعهده Delegate ها هست، البته این یکی از کارآیی های Delegate هست که در مراحل بعد بیشتر در موردش صحبت می کنیم؛ در مورد مثال ما، از Delegate بعنوان Callback استفاده شده؛ دقیقاً یعنی اینطوری : جناب Delegate که ما بنام (UpdateStatusCallback) شما رو نامگذاری کردیم، شما تابع (UpdateStatus) رو که ما با پارامتر رشته ای strMessage بهت میدیم اجرا کن و کارت که تموم شده به ما اطلاع بده!
البته این همه توضیح نبود و فقط میخواستم ترس دوستان بریزه!

پی نوشت : راستش شاید بنظر بعضی از شما که تازه میخواین وارد این مباحث بشید، این مفاهیم خیلی سخت و نامانوس بیاد؛ ولی باور کنید اینقدر که این دات نت همه چی رو "هلو، برو تو گلو" کرده، آدم احساس میکنه در مقایسه، قبلاً تو معدن کار می کردیم و حالا شما به این راحتی می تونید یا این مباحث زیر کولر با یه لیموناد کد بنویسید! اگه بدونید که با چه روشهایی تو C اشاره گر توابع نگهداشته میشدن و برای یک Callback چه مشقاتی باید تحمل میکردیم، واسه یه برنامه Hello World ساده تو C#‎‎‎ حداقل 50 تا Callback استفاده میکردین، تا نهایت سوء استفاده رو ازش ببرین؛ ولی خوب همه که مثل ما عقده ای نشدن! البته خیلی از امثال ماها الان منقرض - بنام مدیر هم میشه ازشون یاد کرد - شدن (بعلت عدم قبول تکنولوژی های جدید) ...

Saeed_m_Farid
سه شنبه 18 خرداد 1389, 11:07 صبح
من 4-5 روزی صبر کردم که یکی از دوستان هم قدمی بردارن یا حداقل سوال، نکته، گوشزد و ... ای از کسی سر بزنه؛ ولی خوب خبری نشد و گفته دوستانی که کار گروهی رو محکوم به شکست میدیدن درست در اومد ولی به هرصورت من عادت ندارم کاری رو که شروع کردم نیمه کاره بذارم. پس فرض رو بر این میذاریم که همه دوستانی که همراهی میکنن تا اینجای مطالب، مورد مبهمی نداشتند و به همه موارد توضیح داده شده، مسلط شدند!
برای اینکه دوستان بیشتر به مطالب اشراف پیدا کنند، دو تا پست خوب در این زمینه تو همین فروم هست، که می تونید بهشون مراجعه کنید :


آموزش Delegate & Event (http://www.barnamenevis.org/forum/showthread.php?t=204974)
آموزش Backgroundworker (http://barnamenevis.org/forum/showthread.php?t=200544&highlight=%D8%A2%D9%85%D9%88%D8%B2%D8%B4+Backgroun dworker)

************************
یه مروری به مطالب ذکر شده بکنیم و بریم سراغ ادامه کار ...
تو پست قبل با Event و Delegate تا حدی که برای فرم ما، لازم بود آشنا شدیم؛ ولی باید بیشتر با این کلمات آشنایی پیدا کنید، چون مجبوریم بازم ازشون استفاده کنیم و به اعمال کلاینت هامون واکنش نشون بدیم؛ همونطور که تو کد فرم می بینید، توابع و کلاسهایی استفاده شدند که فعلاً وجود ندارن و تو یه namespace دیگه تو سولوشن ما قرار دارند به نام ChatServer؛

تایع UpdateStatus و delegate ای که برای اون تعریف کردیم یعنی UpdateStatusCallback رو حتماً تا حالا متوجه شدید که برای چی هستند؟ UpdateStatusCallback تابع UpdateStatusرو اجرا میکنه و نتیجه رو برمیگردونه؛ حالا به کی و چطوری نتیجه برمیگرده؟ با این نتیجه چیکار باید بکنیم یا اصلاً چرا اینکار رو می کنیم، مربوط میشه به namespace ChatServer.
همونطورکه می بینید یه تابع دیگه دارم به نام mainServer_StatusChanged که از delegate مون اونجا استفاده شده :
this.Invoke(new UpdateStatusCallback(this.UpdateStatus), new object[] { e.EventMessage });
این تابع برای این تعریف شده که ما نیاز داریم به عناصر روی فرم مون از طریق یه Thread دیگه (همون ChatServer) دستیابی داشته باشیم، به اینجور عملیات cross-thread call میگن و همونطورکه میدونید تو C#‎‎‎ نمیشه از یه Thread غیر از Thread اصلی (همون کدهایی که تو فرمتون مثلاً واسه کلیک یک Button و ... می نویسید) بصورت مستقیم با اشیاء و منابع فرم کار کرد و باید از یه روشی استفاده کنیم که دستیابی همزمان چندین Thread به اشیاء مدیریت بشه؛ به این نوع برنامه نویسی هم Asynchronous Programming میگن که در اینجا با Invoke و Callback پیاده سازی شده.
این تابع - mainServer_StatusChanged - وظیفه داره وقتی یه رویدادی رخ میده، بصورت آسنکرون پیغام متنی اون رویداد که از طریق پارامتر e از نوع StatusChangedEventArgs به تابع ما پاس داده شده، رو به txtLog اضافه کنه؛ بطور خلاصه یعنی تمام این سه تا فقط واسه اضافه کردن یه خط توضیح یا اطلاع رسانی به txtLogما هستند که فقط برای اینکه از یه Thread دیگه این متن به ما میرسه، اینطوری پیاده سازی شدند؛ امیدوارم که واسه دوستان مطلب جا افتاده باشه؛ چون باید بریم سر مطالب دیگه (اگه سوالی داشتید بی زحمت بپرسید!)
******************
با کدهای که btnListen_Click هستند فعلآً کاری نداریم، چون کاملاً وابسته به شیء ChatServer هست که قراره بعد این توضیح داده بشه.
اولین کلاس تو ChatServer کلاس StatusChangedEventArgs هست که وظیفه نگهداری آرگومان برای رویداد StatusChanged رو برعهده داره، که ما تو فرم مون هم در تابع mainServer_StatusChanged از اون استفاده کردیم :

// Holds the arguments for the StatusChanged event
public class StatusChangedEventArgs : EventArgs
{
// The argument we're interested in is a message describing the event
private string EventMsg;

// Property for retrieving and setting the event message
public string EventMessage
{
get
{
return EventMsg;
}
set
{
EventMsg = value;
}
}

// Constructor for setting the event message
public StatusChangedEventArgs(string strEventMsg)
{
EventMsg = strEventMsg;
}
}

این کلاس زیاد چیز پیچیده ای نداره، یک عضو رشته ای EventMsg، یک تابع set/get برای این عضو بنام EventMessage و یک سازنده که این عضو رو مقداردهی میکنه، کل این کلاس رو تشکیل میدن. در ضمن چون قراره ازش برای رویداد ها استفاده بشه از کلاس EventArgs هم ارث میبره، تمام کلاس همین هست و نکته بیشتری به ذهن نمیرسه.
برای اینکه پست طولانی تر از این نشه، اگه سوالی/اشکالی در توضیحات بنده به ذهن دوستان میرسه، بفرمایند تا بریم سراغ مطالب دیگه ...

battak
سه شنبه 18 خرداد 1389, 11:32 صبح
پس مهندس namespace ChatServer رو بعدا اضافه میکنیم؟؟

Saeed_m_Farid
سه شنبه 18 خرداد 1389, 11:42 صبح
پس مهندس namespace ChatServer رو بعدا اضافه میکنیم؟؟
به تدریج کلاسها و توابع ChatServer رو میریم جلو. چون یکم پیچیده هست، همه رو یکجا نمیارم تا دوستان کم کم سوالی اگه دارند بپرسند، اولیش هم همین کلاس StatusChangedEventArgs بود که یه مختصری توضیح دادمش.
ولی کل سولوشن تو فایل پیوستی که چند پست قبل پیوست کرده بودم، موجود هست. میتونید ببینیدش ...

علیرضا حسن زاده
چهارشنبه 19 خرداد 1389, 09:14 صبح
نه آقا سعید من هم هستیم یکم سرم شلوغه سعی میکنم حضور فعال تری داشته باشم و در حد توانم کمک کنم

battak
چهارشنبه 02 تیر 1389, 09:45 صبح
واقعا از بعضی از دوستان بیشتر از این انتظار می رفت!!!

علیرضا حسن زاده
جمعه 04 تیر 1389, 19:30 عصر
واقعا از بعضی از دوستان بیشتر از این انتظار می رفت!!!
کدهای برنامه رو مرور کنید اگه جایی رو متوجه نمی شید بگید تا توضیح بدیم