PDA

View Full Version : آموزش: پروژه نرم افزار چت در شبکه محلی (سوکت)



m2011kh
جمعه 19 آذر 1395, 19:35 عصر
سلام و خسته نباشید دوستان عزیز.

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

بررسی نرم افزار چت در شبکه محلی (http://barnamenevis.org/showthread.php?533087-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%DA%86%D8%AA-%D8%A8%DB%8C%D9%86-%D8%B4%D8%A8%DA%A9%D9%87&p=2351112#post2351112)

بعد از نشون دادن این پروژه، قرار شد که من آروم آروم در کنار کارهای دیگه ام این پروژه رو تا کامل و تبدیل شدن به یک نرم افزار کامل و قابل استفاده گسترش بدم و وقت خواصی هم برای اتمام پروژه تعیین نشده.

حالا کاری که قصد انجامش رو دارم این هست. در کنار اینکه خودم دارم این پروژه رو گسترش میدم. مشکلات، تئوری ها، سناریو ها، راه حل ها، روش ها و ... رو اینجا قرار میدم تا شاید دوستان تازه کار تر بتونن مطالب رو برداشت کنن و اساتید هم اگه چیزی نیاز بود اضافه کنن.

مطمئنا در پروژه اروم اروم از مباحثی مثل برنامه نویسی چند نخی، شیء گرایی اصولی (تا جایی که علم و زورم برسه)، برنامه نویسی چند لایه، جنریک ها و ... هم نام برده خواهد شد. البته تا جایی که علم کمی که دارم جوابگو باشه.
من اینجا دوباره سرور قبلی که نوشته شده بود رو ضمیمه کردم.

فقط چند تا خواهش کوچیک دارم:
برای پرسش و پاسخ تاپیک جداگونه ای وجود دارد، لطفا از طرح پرسش و یا گفتگو، فقط در تایپیک زیر اقدام کنید:

لینک (http://barnamenevis.org/showthread.php?533200-%D9%BE%D8%B1%D8%B3%D8%B4-%D9%88-%D9%BE%D8%A7%D8%B3%D8%AE-(%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%DA%86%D8%AA-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%85%D8%AD%D9%84%DB%8C-(%D8%B3%D9%88%DA%A9%D8%AA))&p=2351511#post2351511)

نظرتون رو در مورد پروژه بنویسید. چه به صورت پیام خصوصی و یا چه همینجا(به وسیله ی دکمه ی تشکر) تا ببینم اصلا همچین چیزی مورد نیاز دوستان هست و مفید خواهد بود و یا اصلا باید از اینکار صرف نظر کنم.


موفق و سربلند باشید.
M.M.D

m2011kh
جمعه 19 آذر 1395, 20:04 عصر
خب روش من در پیشبرد پروژه ها در چند قدم انجام میشه:

1. طراحی:

- مشخص کردن اهداف پروژه (http://barnamenevis.org/showthread.php?533196-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%DA%86%D8%AA-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%85%D8%AD%D9%84%DB%8C-(%D8%B3%D9%88%DA%A9%D8%AA)&p=2351496&viewfull=1#post2351496)
- توانایی ها و قابلیت های نرم افزار (http://barnamenevis.org/showthread.php?533196-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%DA%86%D8%AA-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%85%D8%AD%D9%84%DB%8C-(%D8%B3%D9%88%DA%A9%D8%AA)&p=2351497&viewfull=1#post2351497)
- مشخص کردن روش ها، مشکلات و راه حل ها (http://barnamenevis.org/showthread.php?533196-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%DA%86%D8%AA-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%85%D8%AD%D9%84%DB%8C-(%D8%B3%D9%88%DA%A9%D8%AA)&p=2351502&viewfull=1#post2351502)

2- طراحی معماری نرم افزار:

- طراحی ساختمان های داده
- سناریو ها
- کلاس ها
- توابع
- انتخواب بانک اطلاعاتی
- معماری بانک اطلاعاتی
- طراحی رابط کاربری روی کاغذ

3. کد نویسی:

- تعریف کردن کلاس ها، توابع، ساختمان های داده
- طراحی رابط کاربری
- کد نویسی کلاس ها و توابع
- متصل کردن کلاس ها، توابع، نخ ها و رابط کاربری

4 - تست و خطایابی

- تست نرم افزار در تمام سناریو های ممکن
- خطایابی و بازنویسی

5 - بسته بندی و ساختن Setup

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

یه نکته دیگه که لازم دونستم بگم:
کل پروژه روی Visual Studio 2013 و SQL Server 2012 انجام میشه.
لطفا اگه اشتباه نگارشی و یا دستور زبان فارسی بین متن ها بود حتما با پیام خصوصی بهم بگید. کلا از همون قدیم املاءم افتضاح بود و تا چند ماه پیش مدتها بود که اصلا فارسی ننوشته بودم، به همین دلیل ممکنه از لحاظ ویراشی و املاء خیلی مشکل داشته باشم.

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

لینک (http://barnamenevis.org/showthread.php?533200-%D9%BE%D8%B1%D8%B3%D8%B4-%D9%88-%D9%BE%D8%A7%D8%B3%D8%AE-(%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%DA%86%D8%AA-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%85%D8%AD%D9%84%DB%8C-(%D8%B3%D9%88%DA%A9%D8%AA))&p=2351511#post2351511)
با تشکر
موفق و سربلند باشید.
M.M.D

m2011kh
جمعه 19 آذر 1395, 20:42 عصر
نیاز ها و اهداف پروژه:

در واقع هدف پروژه، طراحی نرم افزاری برای برقراری ارتباط متنی بین کاربر های داخل یک شبکه محلی هست.

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

البته قصد جسارت به دوستان برنامه نویس عزیز و اساتید ندارم و اصلا در همچین حدی هم نیستم، ولی متأسفانه دانشجو ها و برنامه نویس های آزاد کشورمون کاری که معمولا میکنن و یا حد اقل من دیدم که میکنن، بعد از اینکه تصمیم میگیرن پروژه ای رو انجام بدن یا پیش ببرن تنها کاری که میکنن باز کردن کامپایلر و شروع کردن به کد نویسیه. و طبیعتا چیزی که در انتها نتیجه و محصول کار میشه، پروژه ای شلوغ، مبهم و کد های ناخوانا و غیر اصولی هست که نه تنها باگ های زیاد، سرعت پایین، عدم استفاده درست از منابع در اون وجود داره بلکه اگه یک ماه از اتمام پروژه بگزره و نیاز باشه پروژه رو گسترش بدن یا اصلاح کنن، به یک معضل و فاجعه بر میخورن. چرا که به پروژه ای بر میخورن که هیچ مستند سازی نشده و اونقدر ناخوانا و نامرتب هست که خودشون نمیتونن به یاد بیارن که توی این کد ها دقیقا چیکار کردن.

در واقع هدف دوم تاپیک و پروزه تمرینی برای نوشتن برنامه های چند نخی و چند لایه ای هست. و مشکل دومی که همیشه میبینم بین دوستان تازه کار تر (البته خودم هم در حدی نیستم که خودم رو حرفه ای بدونم :) ) اینه که ظاهرا تفاوتی بین هسته ی برنامه و رابط کاربری و بانک اطلاعاتی نرم افزار قائل نمیشن و به اصطلاح All in one کد میزنن ظاهرا.

و در نهایت یک تمرین و مروری هم روی صف ها، جنریک ها و ... .

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

لینک (http://barnamenevis.org/showthread.php?533200-%D9%BE%D8%B1%D8%B3%D8%B4-%D9%88-%D9%BE%D8%A7%D8%B3%D8%AE-(%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%DA%86%D8%AA-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%85%D8%AD%D9%84%DB%8C-(%D8%B3%D9%88%DA%A9%D8%AA))&p=2351511#post2351511)



موفق و سربلند باشید.
M.M.D

m2011kh
جمعه 19 آذر 1395, 20:58 عصر
توانایی ها و قابلیت های نرم افزار:

- وجود یک سرور واحد
- سرور باید توانایی ارتباط با n کلاینت به صورت همزمان داشته باشه
- هیچ پیامی بین سرور و کلاینت ها در شبکه گم نشه (ارتباط مطمئن)
- در سرور باید مانیتورینگی برای تمام کلاینت ها وجود داشته باشه و اونجا بشه ارتباط را با کسی قطع کرد یا کلاینتی رو بَن یا آزاد کرد
- تمام اطلاعات ارسالی بین سرور و کلاینت ها باید رمز نگاری شده باشه (امنیت) (فقط برای کاراکتر های لاتین)
- رابط کاربری هیچ عملی جز رابط کاربری بودن انجام نده


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

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

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

لینک (http://barnamenevis.org/showthread.php?533200-%D9%BE%D8%B1%D8%B3%D8%B4-%D9%88-%D9%BE%D8%A7%D8%B3%D8%AE-(%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%DA%86%D8%AA-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%85%D8%AD%D9%84%DB%8C-(%D8%B3%D9%88%DA%A9%D8%AA))&p=2351511#post2351511)

موفق و سربلند باشید.
M.M.D

m2011kh
جمعه 19 آذر 1395, 22:23 عصر
برای روش های تعامل سرور و کلاینت ها چندین سناریو تعریف میکنم. در واقع یک استاندارد برای یک روش تعامل بین سرور و کلاینت ها. در واقع یک پروتکل. فعلا برای این پروژه چند سناریو در نظر گرفتم که عبارت اند از:

- سناریو 1: سناریو شروع ارتباط
- سناریو 2: رد بدل کردن پیام های متنی بین سرور و کلاینت
- سناریو 3: روش های قطع کردن ارتباط

سناریو 1:
143714

نکته:فرم های ارتباط دیتا از سرور به کلاینت برای این هستند که دیتا های ارسالی فقط شامل پیام کاربر نیست، بلکه شامل یک ایدی مختص به هر پیام میشن که در واقع هر پیام توسط اون ایدی شناخته میشه. و یک علامت که توسط اون سرور و یا کلاینت متوجه بشه که این دیتاها چه معنی ای میتونن داشته باشن مثلا #n# به این معنی هست که این دیتا شامل نام کاربری کلاینت میشه. و بعد از اون سرور برای کلاینت یه نام ایدی تعریف میکنه که و اونو با علامت #ID# مشخص میکنه و دیتا در مبدا به متغیر های متخلف تقسیم میشن.

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

لینک (http://barnamenevis.org/showthread.php?533200-%D9%BE%D8%B1%D8%B3%D8%B4-%D9%88-%D9%BE%D8%A7%D8%B3%D8%AE-(%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%DA%86%D8%AA-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%85%D8%AD%D9%84%DB%8C-(%D8%B3%D9%88%DA%A9%D8%AA))&p=2351511#post2351511)

m2011kh
شنبه 20 آذر 1395, 00:25 صبح
سناریو 2:

این سناریو پروتکل رد و بدل شدن داده ها از سرور به کلاینت و یا برعکس:

143720

ارسال کننده اول، پیام رو با یک ایدی که نشان دهنده پیام هست ارسال میکنه و یک علامت که نشون دهنده این هست که این یک پیام معمولی از سمت سرور و یا کلاینت هست و معنی خواصی ندارد ( منظور از معنی خواص مثل سناریو اول هست که دیتا خاصی هست که نیاز به نمایش داده شدن نیست بلکه جزو هسته ی کاری سرور و کلاینت هست و اطلاعاتی که کاربر نیاز به دونستن اونها نداره).

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

چرا اینکارو میکنم؟
در پست های بعدی نشون میدم که چطور سرور و کلاینت این صف هارو ایجاد میکنن و توی خودشون نگه میدارن که کدوم پیام رسیده و کدوم نرسیده و اگه پیامی بعد از یک Timeout مشخص به مقصد نرسید اونو دوباره ارسال میکنه و اینکارو به تعداد مشخصی مثلا 10 بار تکرار میکنه و بعد از 10 بار اگه هنوز هم جوابی برنگشت مطمئنا به این معنی هست که کلاینت از اتصال خارج شده و یا مشکلی برای اتصال پیش اومده.




دوستان منتظر نظراتتون خواهم موند، چون اگه خب برای کسی اشتیاقی برای ادامه ی بحث وجود نداشته باشه خب دلیلی هم نداره که من مبحث رو ادامه بدم.


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

لینک (http://barnamenevis.org/showthread.php?533200-%D9%BE%D8%B1%D8%B3%D8%B4-%D9%88-%D9%BE%D8%A7%D8%B3%D8%AE-(%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%DA%86%D8%AA-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%85%D8%AD%D9%84%DB%8C-(%D8%B3%D9%88%DA%A9%D8%AA))&p=2351511#post2351511)
موفق و سربلند باشید.
M.M.D

m2011kh
شنبه 20 آذر 1395, 01:34 صبح
سناریو 3:

143721

سرور یا کلاینتی که قصد به اتمام اتصال داره، پیامی ارسال میکنه به شکلی که در تصویر میبینید و وقتی اوکی رو دریافت کرد اتصال عملا قطع میشه.

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

در مورد سناریو ها باید این نکته رو هنوز عرض کنم که همه سناریو ها از سناریو دوم برای اطمینان از رفت و آمد بسته ها تبعیت میکنند. در واقع پیام هایی که پیام های متنی از سمت کاربر ها هم نیستند تا زمانی که توسط سناریو دوم اعتبار سنجی نشده باشند عملا اعتبار اجرایی نخواهند داشت. یعنی مثلا زمانی که سرور قصد قطع ارتباط با یک کلاینت رو داره. پیام قطع ارتباط رو میفرسته و وقتی دو طرف مطمئن شدند که پیام رسیده طرف مقابل پیام تأیید رو میفرسته و باز هم زمانی که دو طرف مطمئن شدن که پیام تأیید رسیده اون موقع این دستور اعتبار اجرایی داره و دو طرف سوکت مورد نظر رو میبندن.

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


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

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

لینک (http://barnamenevis.org/showthread.php?533200-%D9%BE%D8%B1%D8%B3%D8%B4-%D9%88-%D9%BE%D8%A7%D8%B3%D8%AE-(%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%DA%86%D8%AA-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%85%D8%AD%D9%84%DB%8C-(%D8%B3%D9%88%DA%A9%D8%AA))&p=2351511#post2351511)

موفق و سربلند باشید.
M.M.D