نمایش نتایج 1 تا 34 از 34

نام تاپیک: Tabriz Messenger

  1. #1
    کاربر دائمی آواتار taghvajou
    تاریخ عضویت
    تیر 1387
    محل زندگی
    تهران
    سن
    40
    پست
    571

    Post Tabriz Messenger

    با نام و توکل به خدای متعال، تاپیک تمرین و پروژه مسنجر بچه های تبریز رو در راستای تاپیک:
    https://barnamenevis.org/showthread.php?t=217776

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

  2. #2
    کاربر دائمی آواتار علیرضا حسن زاده
    تاریخ عضویت
    تیر 1388
    محل زندگی
    تــــــــــــــــــــــــــبریز
    پست
    897

    نقل قول: Tabriz Messenger

    خوب دوست عزیز taghvajou جریان چه جوری شد؟ ریموت دسکتاپ رو کار کنیم مسنجر رو البته اگه ریموت دسکتاپ رو کار کنیم همون کار رو به صورت پیشرفته رو انجام دادیم حالا استارت بزنین که شروع کنیم اگر هم دوستان برنامه آماده ای دارن در این زمینه (تو #C باشه بهتره به نظر من) میشه از اون هم کمک گرفت تا یه برنامه خوب درست کنیم

  3. #3
    کاربر دائمی آواتار taghvajou
    تاریخ عضویت
    تیر 1387
    محل زندگی
    تهران
    سن
    40
    پست
    571
    در واقع منظورمون تبادل متن، صوت، تصویره و فیلمه! اسمش رو هر چی بخوایم میشه گذاشت!
    به اضافه یه سری امکانات اضافی مثل جمع کردن بقیه آی ام ها و ...
    بازهم ایده های دیگه مون رو به مرور اضافه میکنیم. پس فعلا میریم تو کار!

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

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

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

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

    که برای سهولت کار تو قدم اول پیشنهاد میکنم اول از گزینه اول استفاده کنیم.
    آخرین ویرایش به وسیله mehdi.mousavi : پنج شنبه 22 مهر 1389 در 23:35 عصر دلیل: ادغام دو پست متوالی

  4. #4
    کاربر دائمی آواتار علیرضا حسن زاده
    تاریخ عضویت
    تیر 1388
    محل زندگی
    تــــــــــــــــــــــــــبریز
    پست
    897

    نقل قول: Tabriz Messenger

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

  5. #5
    کاربر دائمی آواتار battak
    تاریخ عضویت
    آبان 1387
    محل زندگی
    تبریز
    سن
    40
    پست
    136

    نقل قول: Tabriz Messenger

    سلام ،
    من امروز این تاپیک رو دیدم.
    خب مهندسین گرامی، از دست ما چه کاری بر میاد؟

  6. #6
    کاربر دائمی آواتار علیرضا حسن زاده
    تاریخ عضویت
    تیر 1388
    محل زندگی
    تــــــــــــــــــــــــــبریز
    پست
    897
    با Desktop بودن برنامه موافقم بهتر میشه توسعش داد

    این تاپیک مثل اینکه نمی خواد راه بیفته؟
    آخرین ویرایش به وسیله mehdi.mousavi : پنج شنبه 22 مهر 1389 در 23:35 عصر دلیل: ادغام دو پست متوالی

  7. #7
    کاربر دائمی آواتار battak
    تاریخ عضویت
    آبان 1387
    محل زندگی
    تبریز
    سن
    40
    پست
    136

    نقل قول: Tabriz Messenger

    من اگه میدونستم اومدنمون به این سمت بچه ها رو فراری میده، هیچ وقت این پیشنهادو نمیدادم!!

  8. #8
    کاربر دائمی آواتار taghvajou
    تاریخ عضویت
    تیر 1387
    محل زندگی
    تهران
    سن
    40
    پست
    571

    نقل قول: Tabriz Messenger

    سلام به همه
    داش آتان عزیز! کسی فراری داده نشده!

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

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

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

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

    خوب! ممنون

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

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

    فقط یه سوال از دوستا!
    آیا یه چیزی اولیه درست کنیم بذاریم اینجا یا اینکه
    تمام مراحل کار رو اینجا مو به مو بنویسیم و هر کس کد خودشو بنویسه
    یا اینکه یا سورس کنترل راه اندازی کنیم؟
    آخرین ویرایش به وسیله taghvajou : دوشنبه 10 خرداد 1389 در 12:07 عصر

  9. #9
    کاربر دائمی آواتار علیرضا حسن زاده
    تاریخ عضویت
    تیر 1388
    محل زندگی
    تــــــــــــــــــــــــــبریز
    پست
    897
    مثلا بذار ببینیم علیرضا دیتابیس بهمون میده یا مثلا خودمون یه کاری کنیم (البته بنده هم میتونم دیتا بیس تحت وب بدم)
    من کی خودمو کنار کشیدم در حد توان هر کمکی از دستم بربیاد انجام می دم

    آیا یه چیزی اولیه درست کنیم بذاریم اینجا یا اینکه
    به نظر من بهتره یه طرح کلی از برنامه ای می خوایم کار کنیم رو ارائه بدیم بعد رو قسمت های مختلف اون کار کنیم ولی اینکه طرح کلی برنامه مشخص باشه خیلی بهتره اینطوری امکان اضافه کردن خصوصیات جدید هم با در نظر گرفتن آینده برنامه در طرح کلی، هم آسون تر میشه خلاصه برنامه رو یه تجزیه تحلیل بکنیم
    آخرین ویرایش به وسیله mehdi.mousavi : پنج شنبه 22 مهر 1389 در 23:36 عصر دلیل: ادغام دو پست متوالی

  10. #10
    کاربر دائمی آواتار taghvajou
    تاریخ عضویت
    تیر 1387
    محل زندگی
    تهران
    سن
    40
    پست
    571

    نقل قول: Tabriz Messenger

    خوب میشه یه توضیح بگی، منظورت رو از طرح کلی نفهمیدم. یعنی یه چیزی بیشتر از اونچه که تا حالا گفته شده و جمع بندی شده؟

  11. #11
    کاربر دائمی آواتار battak
    تاریخ عضویت
    آبان 1387
    محل زندگی
    تبریز
    سن
    40
    پست
    136

    نقل قول: Tabriz Messenger

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

  12. #12
    کاربر دائمی آواتار taghvajou
    تاریخ عضویت
    تیر 1387
    محل زندگی
    تهران
    سن
    40
    پست
    571

    نقل قول: Tabriz Messenger

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

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

  13. #13
    کاربر دائمی آواتار علیرضا حسن زاده
    تاریخ عضویت
    تیر 1388
    محل زندگی
    تــــــــــــــــــــــــــبریز
    پست
    897

    نقل قول: Tabriz Messenger

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

  14. #14
    کاربر دائمی آواتار taghvajou
    تاریخ عضویت
    تیر 1387
    محل زندگی
    تهران
    سن
    40
    پست
    571

    نقل قول: Tabriz Messenger

    ممنون میشم که در مورد این کلیت خودت یه چیزهایی رو بگی تا اگه به ذهنمون رسید تکمیل کنیم.

  15. #15
    کاربر دائمی آواتار علیرضا حسن زاده
    تاریخ عضویت
    تیر 1388
    محل زندگی
    تــــــــــــــــــــــــــبریز
    پست
    897
    نقل قول نوشته شده توسط taghvajou مشاهده تاپیک
    ممنون میشم که در مورد این کلیت خودت یه چیزهایی رو بگی تا اگه به ذهنمون رسید تکمیل کنیم.
    اگه طرف سوالتون من بودم باید خدمتتون عرض کنم که اگه بخوایم برنامه رو به صورت کلاینت/سرور پیاده سازی کنیم روش های مختلفی وجود داره مثلا مسنجر ها یا برنامه هایی مثل RemoteDesktop هرکدوم از پروتکل های خاصی پیروی می کنن که تو RFC ها توضیح داده شده (البته به صورتی که یه برنامه که بخواد چنین کاری رو انجام بده چه چیزهایی رو باید رعایت کنه و موارد دیگه) در این مسیر اگه پیش بریم برنامه بصورت تقریبا پیشرفته عمل میکنه و بنده هم مطالعه و بحث در این موارد و پیاده سازی اونها مد نظرم بود و همچین معرفی مراجعی در این مورد برای دوستانی که می خوان با هم همراه باشیم البته روش دیگه ای هم وجود داره که مثل پروژه های دانشجویی ساده شروع کنیم به کار با TCP به صورت خیلی مبتدی و یه پورت رو باز کنیم و یه تکست بفرستیم و ... سرور به پورت گوش کنه و پیام رو نشون بده و بقیه ماجرا البته کلیتش فرقی نمیکنه ولی تو ریز کار خیلی با هم فرق دارن ازلحاظ امنیت، کارایی و...

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

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

    کار ساخت یافته و اصولی باشه بهتر نیست؟
    آخرین ویرایش به وسیله mehdi.mousavi : پنج شنبه 22 مهر 1389 در 23:37 عصر دلیل: ادغام دو پست متوالی

  16. #16
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    46
    پست
    1,046

    نقل قول: Tabriz Messenger

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

  17. #17
    کاربر دائمی آواتار taghvajou
    تاریخ عضویت
    تیر 1387
    محل زندگی
    تهران
    سن
    40
    پست
    571
    نقل قول نوشته شده توسط Saeed_m_Farid مشاهده تاپیک
    من همونطورکه قول دادم از پست بعد شروع میکنم به کدنویسی و توضیحات، اگه اجازه بدین ...
    مارکو جان، قبول شروع کنیم ولی اول بگو که تبادل کدهامون چطور باشه:
    1- کد بنویسیم و سورس هارو بذاریم اینجا و کلیات کاری که انجام شده رو اینجا بنویسیم.
    2- تمام مراحل و کارهامون رو جز به جز اینجا بیان کنیم.
    3- کدهارو تو یه سامانه سورس کنترلینگ بذاریم و اینجا کلیاتش رو بگیم.

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

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

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

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

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

    دوم) قبل از کدهامون بیا اول دیتابیسمون رو تهیه کنیم و بدیم علیرضا آپلود کنه
    آخرین ویرایش به وسیله mehdi.mousavi : پنج شنبه 22 مهر 1389 در 23:37 عصر دلیل: ادغام سه پست متوالی

  18. #18
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    46
    پست
    1,046
    نقل قول نوشته شده توسط taghvajou مشاهده تاپیک
    2- تمام مراحل و کارهامون رو جز به جز اینجا بیان کنیم.
    من با این موافقم، دلیلش هم اینه که درگیر مسایل دیگه مثل پایگاه داده، وضعیت فعلی اینترنت، هزینه های جانبی و از همه مهمتر منحرف شدن هدف که آموزشی هست نشیم؛ من با شناختی که از اونیکی تاپیک داشتم، احساس می کنم هدف دوستان شروع هست نه اینکه یه پروژه رو بصورت کامل به مرحله توسعه نجاری برسونند ...
    اگه بعداً خواستیم میتونیم با همین دوستان که تو مراحل پروژه همراهی کردن و البته استفاده از پیشنهادات و امکاناتی که اسپانسر! های عزیز دراختیار میذارن وارد فازهای پروژه قابل عرضه بشیم ...
    البته دوستان دیگه اگه نظری دارن بگن؛ بنده تابع جمع هستم ...
    نقل قول نوشته شده توسط taghvajou مشاهده تاپیک
    من میگم یه پایگاه داده داشته باشیم تو وب، تمام پیامهامون رو تو اون ذخیره کنیم با جزئیاتش،مثل آیدی گیرنده، فرستنده، زمان، متن و ... و فلگ استاتوسش.
    بعد یه ترد یا تایمر تو کلاینتمون داشته باشیم که بره از پایگاه داده چک کنه که آیا پیامی واسه این کاربر وجود داره بیاره و نمایش بده و نیز آیا کاربر پیامی تو برنامه کلاینت وارد کرده باشه اون رو به سرور ببره و ذخیره کنه!

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

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

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

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

    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله mehdi.mousavi : پنج شنبه 22 مهر 1389 در 23:38 عصر دلیل: ادغام دو پست متوالی

  19. #19
    کاربر دائمی آواتار علیرضا حسن زاده
    تاریخ عضویت
    تیر 1388
    محل زندگی
    تــــــــــــــــــــــــــبریز
    پست
    897

    نقل قول: Tabriz Messenger

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

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

  20. #20
    کاربر دائمی آواتار battak
    تاریخ عضویت
    آبان 1387
    محل زندگی
    تبریز
    سن
    40
    پست
    136

    نقل قول: Tabriz Messenger

    منم كه طبق معمول هستم و دارم دوستان رو همراهي ميكنم ولي چون نميدونم چي بايد بگم فقط خواستم بگم، موفق باشين و خسته نباشين

  21. #21
    کاربر دائمی آواتار taghvajou
    تاریخ عضویت
    تیر 1387
    محل زندگی
    تهران
    سن
    40
    پست
    571

    نقل قول: Tabriz Messenger

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

  22. #22
    کاربر دائمی آواتار shirin_sh1024
    تاریخ عضویت
    خرداد 1387
    محل زندگی
    تهران
    پست
    136

    نقل قول: Tabriz Messenger

    سلام دوستان
    راستش من آذری نیستم ولی این پروژه ای که دارید انجام میدین رو دنبال میکنم چون کار خیلی جالبیه امیدوارم خوب پیش بره.
    فقط یه سئوالی برام پیش اومد بهتر نیست اول پروژه رو تحلیل کنید بعد برید سراغ پیاده سازی؟

  23. #23
    کاربر دائمی آواتار taghvajou
    تاریخ عضویت
    تیر 1387
    محل زندگی
    تهران
    سن
    40
    پست
    571

    نقل قول: Tabriz Messenger

    حضورتون رو به جمعمون خیر مقدم عرض میکنیم. فقط خواهشا آنچه که گذشته رو با دقت یه بار مرور کنین.

  24. #24
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    46
    پست
    1,046

    نقل قول: Tabriz Messenger

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

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

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

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

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

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

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

  25. #25
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    46
    پست
    1,046

    نقل قول: Tabriz Messenger

    خواهشاً حوصله دوستان سرنره، سعی خواهد شد تو این پست همه چیز از صفر گفته بشه و پس از این پست در هر مرحله، درصورت نیاز مفاهیمی که ممکنه کمتر به گوش خورده باشن، تا اونجایی که سوادمون قد میده توضیح داده بشن. توضیح که میگم نه اینکه مثلاً 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 بذارید. با مرتب کردن جاهاشون فرم تون تقریباً میشه یه چیزی مثل فرم زیر


    اینکه تاکید روی اسامی و 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");
    }

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

  26. #26
    کاربر دائمی آواتار taghvajou
    تاریخ عضویت
    تیر 1387
    محل زندگی
    تهران
    سن
    40
    پست
    571
    فقط یه چیزی!
    به نظر میاد فعلا نمیشه در مورد چیزی بحث کرد! در مورد متدها و اونت ها من نیاز به بحث می بینم تا تکمیل ترش کنیم. این یک.

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

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


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

    ممنون ادامه بده ما هم هستیم و کمک میکنیم.
    آخرین ویرایش به وسیله mehdi.mousavi : پنج شنبه 22 مهر 1389 در 23:39 عصر دلیل: ادغام دو پست متوالی

  27. #27
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    46
    پست
    1,046

    نقل قول: Tabriz Messenger

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

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

  28. #28
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    46
    پست
    1,046

    فلسفه Callback ،Delegate ،Events و ...

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

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

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

    بعنوان راه حل، روشی که استفاده میشه، عبارتست از 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 استفاده میکردین، تا نهایت سوء استفاده رو ازش ببرین؛ ولی خوب همه که مثل ما عقده ای نشدن! البته خیلی از امثال ماها الان منقرض - بنام مدیر هم میشه ازشون یاد کرد - شدن (بعلت عدم قبول تکنولوژی های جدید) ...

  29. #29
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    46
    پست
    1,046

    نقل قول: Tabriz Messenger

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


    ************************
    یه مروری به مطالب ذکر شده بکنیم و بریم سراغ ادامه کار ...
    تو پست قبل با 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 هم ارث میبره، تمام کلاس همین هست و نکته بیشتری به ذهن نمیرسه.
    برای اینکه پست طولانی تر از این نشه، اگه سوالی/اشکالی در توضیحات بنده به ذهن دوستان میرسه، بفرمایند تا بریم سراغ مطالب دیگه ...

  30. #30
    کاربر دائمی آواتار battak
    تاریخ عضویت
    آبان 1387
    محل زندگی
    تبریز
    سن
    40
    پست
    136

    نقل قول: Tabriz Messenger

    پس مهندس namespace ChatServer رو بعدا اضافه میکنیم؟؟

  31. #31
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    46
    پست
    1,046

    نقل قول: Tabriz Messenger

    نقل قول نوشته شده توسط battak مشاهده تاپیک
    پس مهندس namespace ChatServer رو بعدا اضافه میکنیم؟؟
    به تدریج کلاسها و توابع ChatServer رو میریم جلو. چون یکم پیچیده هست، همه رو یکجا نمیارم تا دوستان کم کم سوالی اگه دارند بپرسند، اولیش هم همین کلاس StatusChangedEventArgs بود که یه مختصری توضیح دادمش.
    ولی کل سولوشن تو فایل پیوستی که چند پست قبل پیوست کرده بودم، موجود هست. میتونید ببینیدش ...

  32. #32
    کاربر دائمی آواتار علیرضا حسن زاده
    تاریخ عضویت
    تیر 1388
    محل زندگی
    تــــــــــــــــــــــــــبریز
    پست
    897

    نقل قول: Tabriz Messenger

    نه آقا سعید من هم هستیم یکم سرم شلوغه سعی میکنم حضور فعال تری داشته باشم و در حد توانم کمک کنم

  33. #33
    کاربر دائمی آواتار battak
    تاریخ عضویت
    آبان 1387
    محل زندگی
    تبریز
    سن
    40
    پست
    136

    نقل قول: Tabriz Messenger

    واقعا از بعضی از دوستان بیشتر از این انتظار می رفت!!!

  34. #34
    کاربر دائمی آواتار علیرضا حسن زاده
    تاریخ عضویت
    تیر 1388
    محل زندگی
    تــــــــــــــــــــــــــبریز
    پست
    897

    نقل قول: Tabriz Messenger

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

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •