PDA

View Full Version : راهنمایی در مورد طراحی یک برنامه مسنجر



aftabgarmabakhsh
یک شنبه 18 آذر 1397, 13:39 عصر
با سلام
من میخواهم برای یک شرکت که حدود 500سیستم دارد یک برنامه ویندوزی پیام رسان بنویسم، که هم امکان ارسال پیام و انواع فایل داشته باشد که بلافاصله گیرندگان ، پیام را دریافت کنند(به جای تابلو اعلانات) هم قابلیت چت داشته باشد. بعدهها نسخه موبایل هم برایش تهیه کنیم
دیتابیس هم sql server هست
شما چه روشی برای پیاده سازیش پیشنهاد میدید؟
خودم به این نتیجه رسیدم که
الف) یک وب سرویس داشته باشم شامل متدهایی برای ارسال و دریافت پیام/ مشاهده کاربران / مشاهده گروهها که برنامه کلاینتم اصلا مستقیم به دیتابیس وصل نشوند و نخواهند مستقیما پروسیجر اجرا کنند
ب) یک ویندوز سرویس روی سرور داشته باشم که به دیتابیس وصل باشد و تغییرات یا پیامهای جدید را از طریق sql dependency مطلع بشود و از طریق signalR به کلاینت مربوطه، اطلاع دهد
ج) برنامه های کلاینت با wpf که از طریق وب سرویس به دیتابیس وصل هستند و با signalR سرور متوجه میشوند پیغام جدید دارند یا نه


اصلا این روشی که میخواهم استفاده کنم درسته؟ بار روی سرور زیاد نمیشه؟ بهتر از این هست که خود کلاینتها از طریق store procedure به بانک وصل بشن؟ روش سوکت پروگرامینگ چطوریه به نظرتون؟

ممنون میشم راهنماییم کنید

m.r226
یک شنبه 18 آذر 1397, 13:52 عصر
شما به هرشکلی که دوست داری میتونی نرم افزارت رو بنویسی

ما میتونیم هرطوری که بخوایم غذا بخویم، چه با قاشق چنگال، چه با دست و چه با پا!

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


دوست عزیز شما برای پیاده سازی یک پیامرسان به خیلی چیزا نیاز داری، منتها به نظر من نیاز به پیاده سازی الگوی Observer هست اگر و اگر نمیخوای ساختار Pear To Pear رو پیاده کنی.

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

aftabgarmabakhsh
یک شنبه 18 آذر 1397, 14:27 عصر
شما به هرشکلی که دوست داری میتونی نرم افزارت رو بنویسی

ما میتونیم هرطوری که بخوایم غذا بخویم، چه با قاشق چنگال، چه با دست و چه با پا!

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


دوست عزیز شما برای پیاده سازی یک پیامرسان به خیلی چیزا نیاز داری، منتها به نظر من نیاز به پیاده سازی الگوی Observer هست اگر و اگر نمیخوای ساختار Pear To Pear رو پیاده کنی.

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

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

در مورد الگوی observer میشود بیشتر توضیح بدهید؟

mrbm_2007
یک شنبه 18 آذر 1397, 19:53 عصر
سلام
این روش چطوریه؟:
1. وب سرویس در سرور اجرا شود
2. کلاینت ها با ارتباط به سرور (وب سرویس) پیام ها رو بفرستند و پیام در دیتابیس ذخیره شود
3. در وب سرویس لیستی از کاربرانی که پیام جدید دارند نگه داشته شود (یک متغییر استاتیک به صورت لیست) و به محض ارسال پیام از کلاینت ها، آی دی مخاطب به این لیست افزوده شود (ضمنا در استارت آپ وب سرویس باید این لیست از دیتابیس بروز رسانی شود)
4. کلاینت ها با تایمر از سرور در مورد وجود پیام جدید سوال کنند (که این کار از طریق سوکت هم ممکنه، یعنی کلاینت ها به سرور گوش بدن و سرور بهشون اطلاع بده ولی به نظر من این که کلاینت از طریق وب سرویس اخرین وضعیت رو چک کنه بهتره)
5. در صورت وجود پیغام جدید کلاینت در خواست گرفتن پیام ها رو بده و سرور بعد از ارسال پیام ها اون آی دی رو از لیست بالا حذف کنه

لطفا اگر جایی مشکل داره نظر بدبد،

aftabgarmabakhsh
دوشنبه 19 آذر 1397, 07:57 صبح
سلام
این روش چطوریه؟:
1. وب سرویس در سرور اجرا شود
2. کلاینت ها با ارتباط به سرور (وب سرویس) پیام ها رو بفرستند و پیام در دیتابیس ذخیره شود
3. در وب سرویس لیستی از کاربرانی که پیام جدید دارند نگه داشته شود (یک متغییر استاتیک به صورت لیست) و به محض ارسال پیام از کلاینت ها، آی دی مخاطب به این لیست افزوده شود (ضمنا در استارت آپ وب سرویس باید این لیست از دیتابیس بروز رسانی شود)
4. کلاینت ها با تایمر از سرور در مورد وجود پیام جدید سوال کنند (که این کار از طریق سوکت هم ممکنه، یعنی کلاینت ها به سرور گوش بدن و سرور بهشون اطلاع بده ولی به نظر من این که کلاینت از طریق وب سرویس اخرین وضعیت رو چک کنه بهتره)
5. در صورت وجود پیغام جدید کلاینت در خواست گرفتن پیام ها رو بده و سرور بعد از ارسال پیام ها اون آی دی رو از لیست بالا حذف کنه

لطفا اگر جایی مشکل داره نظر بدبد،

اون تایمر بده. چون سرور همش درگیره حتی اگه پیغام جدیدی وجود نداشته باشه

رامین مرادی
دوشنبه 19 آذر 1397, 08:39 صبح
سلام وقت بخیر.

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

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



یا اینکه برید سراغ نود جی اس nodejs .

aftabgarmabakhsh
دوشنبه 19 آذر 1397, 10:43 صبح
سلام وقت بخیر.

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

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



یا اینکه برید سراغ نود جی اس nodejs .

من توی روش پیشنهادیم که از تایمر استفاده نکردم. میخوام از signalR استفاده کنم
سوکت چه مزیتی نسبت به signalRداره؟

nodejs مگه توی برنامه های ویندوزی هم استفاده میشه؟

mrbm_2007
دوشنبه 19 آذر 1397, 13:14 عصر
یه سوال مهم،
اینکه مکانیز داخلی سوکت چجوریه؟ یعنی فرق اش با تایمر چیه؟ وقتی شروع به گوش دادن کردن به طور مدام چک نمی کنه؟؟
در مورد signalR هم می تونید توضیح بدید؟ یا منبع معرفی کنید؟

mrbm_2007
دوشنبه 19 آذر 1397, 20:42 عصر
یه سوال مهم،
اینکه مکانیز داخلی سوکت چجوریه؟ یعنی فرق اش با تایمر چیه؟ وقتی شروع به گوش دادن کردن به طور مدام چک نمی کنه؟؟
در مورد signalR هم می تونید توضیح بدید؟ یا منبع معرفی کنید؟
کسی اینجا نیست در این مورد اطلاعاتی داشته باشه؟

رامین مرادی
سه شنبه 20 آذر 1397, 13:13 عصر
یه سوال مهم،
اینکه مکانیز داخلی سوکت چجوریه؟ یعنی فرق اش با تایمر چیه؟ وقتی شروع به گوش دادن کردن به طور مدام چک نمی کنه؟؟
در مورد signalR هم می تونید توضیح بدید؟ یا منبع معرفی کنید؟

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

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

فک کنم مثال خیلی ساده ای زدم.



من توی روش پیشنهادیم که از تایمر استفاده نکردم. میخوام از signalR استفاده کنم
سوکت چه مزیتی نسبت به signalRداره؟

nodejs مگه توی برنامه های ویندوزی هم استفاده میشه؟

در مورد سینگل آر اطلاعاتی ندارم.

بله شما میتونید nodejs رو روی یه سیستم یا وی پی اس نصب کنید . و سرور براش بنویسید.
سپس برنامه کلاینت رو با هر زبونی پیاده سازی کنید. شما در حقیقت به یک آی پی و پورت خاصی اطلاعات ارسال میکنید و در طرف مقابل اونو دریافت و پردازش میکنه حالا ممکنه سرورتون هر چیزی باشه چه نود و...

این دوتا لینک رو نگاه کنید.
https://www.youtube.com/watch?v=HyGtI17qAjM بخش سرور
https://www.youtube.com/watch?v=nwV3MS6pryY بخش کلاینت

m.r226
سه شنبه 20 آذر 1397, 14:15 عصر
در مورد الگوی observer میشود بیشتر توضیح بدهید؟

فارسی
https://www.dotnettips.info/post/2365/%D8%A7%D9%84%DA%AF%D9%88%DB%8C-%D9%85%D8%B4%D8%A7%D9%87%D8%AF%D9%87%E2%80%8C%DA%A F%D8%B1-observer-pattern

انگلیسی عالی
https://refactoring.guru/design-patterns/observer این بخشش رو اول بخون Real World Analogy

mrbm_2007
سه شنبه 20 آذر 1397, 18:14 عصر
ببینید به زبان ساده میشه اینو گفت. من برنامه هستم. یه نفرو استخدام میکنم (جناب سوکت) میفرستم جلو درمون فال گوش وای میسه. اگه پستچی نامه ای واسم آورد اون جناب سوکت زود میاد به من خبر میده.
حالا شما وقتی سوکت ایجاد میکنید میگید آی پی من اینه و پورتمم اینه (اینا میشه آدرس شما برا سرور هم همین مراحل صدق میکنه) سرور هم آی پی و پورت شما رو میدونه شما هم مال سرور رو میدونید. حالا سرور خواست به شما چیزی ارسال کنه به اون آی پی و پورتتون ارسال میکنه. سوکت شما هم گوش به زنگه هروقت چیزی رسید به شما خبر میده (برا سرورم اینطوره)

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

فک کنم مثال خیلی ساده ای زدم.




در مورد سینگل آر اطلاعاتی ندارم.

بله شما میتونید nodejs رو روی یه سیستم یا وی پی اس نصب کنید . و سرور براش بنویسید.
سپس برنامه کلاینت رو با هر زبونی پیاده سازی کنید. شما در حقیقت به یک آی پی و پورت خاصی اطلاعات ارسال میکنید و در طرف مقابل اونو دریافت و پردازش میکنه حالا ممکنه سرورتون هر چیزی باشه چه نود و...

این دوتا لینک رو نگاه کنید.
https://www.youtube.com/watch?v=HyGtI17qAjM بخش سرور
https://www.youtube.com/watch?v=nwV3MS6pryY بخش کلاینت

مثال عالی بود، در واقع ترافیک روی شبکه به شدت کم خواهد شد! گرفتم.

aftabgarmabakhsh
چهارشنبه 21 آذر 1397, 07:36 صبح
ممنون لطف کردید