PDA

View Full Version : چت روم (Chat Room) + یادگیری مفاهیم جدید + بررسی چند نکته ی بسیار مهم



majid_darab
یک شنبه 30 خرداد 1389, 18:08 عصر
(KeyWords ---> (Ajax - Sql Server 2008 - ChatRoom - Chat Room - ClientSide - Client Side - JavaScript

با سلام و عرض خسته نباشید خدمت دوستان عزیز خودم :

چندی پیش با یکی از دوستان خود سر موضوع چت روم بحث شد و تصمیم گرفتیم یه چت روم کوچک در وب سایت خود داشته باشیم ...
اولین موضوعی که ذهن ما رو به خود درگیر می کرد این بود که مکانیزم رفرش شدن پنجره ی پیغام ها بدون پست بک چگونه می تواند باشد که هر گونه stop و لَختی از دید کاربر محو شود...(درست است که ما با مفاهیم Ajax و ClientSide آشنایی داریم ، اما چگونه آنها را برای این منظور به کار بگیریم؟)
پرواضح است که برای این مهم هم باید روی Ajax مانور داد و هم کدهای کلاینت ساید = مثلاً JavaScript ...
لذا برای شروع کار دوست من لینک پروژه ای که در اینترنت قرار داشت را برایم ارسال کرد تا پس از بررسی و همفکری و اعمال تغییرات در آن به آن صورت که می خواهیم به نتیجه ی مطلوب برسیم!

پروژه و موارد قابل توضیح آن که توسط آقای Junnark Vicencio ایجاد شده است در لینک زیر موجود است و به زیبایی هر چه تمام تر توضیح داده شده است ....
http://www.junnark.com/Articles/Build-a-Web-Chat-Application-Using-ASP-Net-LINQ-and-AJAX-CS.aspx
اما قبل از دانلود پروژه به موارد زیر توجّه نمایید ...
===========================================
با توجه به اینکه من با LINQ زیاد انس ندارم و به دلیل رعایت روش اصولی در بکار گیری لایه های برنامه از روش اعلام شده توسط مدیر وب سایت استفاده می کنم ، لذا روش ارتباط با دیتابیس رو در پروژه ای که Upload نمودم تغییر دادم و انجام این کار در Develop و توسعه دادن این پروژه بسیار کارآمد خواهد بود.
به هر تقدیر موضوع بالا مورد بحث ما نیست و در این پروژه قصد براین است که نکات مهم دیگری را درآن بررسی و تصحیح نماییم ...

خوب در این پروژه موارد زیر خیلی خیلی برام جالب بود :

1- استفاده از Div برای کاربردی که خواهید دید...

2- داشتن پرش از کد کلاینت ساید به سرورساید (How Call ServerSide From ClientSide With JavaScript)->
مدتها بود دنبال این روش بودم و خوب به روش های متعددی دست یافتم که به دل نمی نشست (مثلاً استفاده از Jquey و به دنبال آن WebMethod که لازمه ی آن Static بودن متد مربوطه در کدبیهایند می بود و این یعنی دسترسی نداشتن به Element های صفحه در این متد , یا استفاده از ScripManager در این باب و ...)

3- استفاده از Literal برای کاربردی که خواهید دید...

4- موضوعی که در مورد تکست باکس های پولدار عوان گردیده است و ...

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

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

واما پروژه ی تغییر داده شده به همراه دیتابیس تغییر داده شده در فایلChatRoom.rar <-
(ASP.NET web app with vs 2008 + sql server 2008)


با تشکر از توجه و همیاری شما دوستان عزیز
مجید داراب

naser2009
یک شنبه 30 خرداد 1389, 22:26 عصر
سلام به همه دوستان
برنامه نویس های خفنگه سایته وزین برنامه نویس لطفا کمک کنن
پروژه chat رو customized کنیم و از این به بعد تو پروژه هامون استفاده کنیم.
البته اگه مشکلات بالا حل شه!
من که پایه ام:لبخند:
راستی textboxهای پولدار دیگه چه صیغه ایه؟
باتشکر

naser2009
یک شنبه 30 خرداد 1389, 23:14 عصر
سلام بیایید بحث رو شروع کنیم!

اول اینکه اصلا ذخیره کردن پیغام ها و کاربران login شده در database سنگینی مثله sql server درسته ، حالا میگیم کاربران(جدول Users) و اتاق های چت (جدول Room) باید در Database ذخیره بشن ولی پیغام ها و کاربران آنلاین ممکنه خیلی زیاد بشن
حالا باز فرض کنین که تعداد کاربران موجود در یک روم رو محدود کنیم ولی تعداد پیام ها رو که نمی تونیم(یعنی معقولانه نیست که محدود کنیم)
تازه اگه بخواهین این کار رو هم بکنین باید یه امکان واسه تخلیه database بزاریم که به صورت automatic باشه مثلا موقعی که کاربر logout میکنه مسیج های مربوط به اون کاربر هم پاک بشه! که این اتفاق نمیفته و موقعی که یه بار logout میکنیم و دوباره login میتونیم تمام مسیج های قبلی رو می بینیم(و این یه مشکله)

من یه برنامه دیگه چت رو تو همین سایت پیدا کردم که اون به جای استفاده از database از کلاس های generic واسه ذخیره مسیج ها کاربران و روم ها استفاده می کرد و مکانیزم عجیبی داشت ولی مکانیزم refresh صفحه ش ،استفاده از page method ها بود.

دوستان هم یه نگاه بندازن ببینن اینطوری چطوریه؟
اینم لینکش (http://www.barnamenevis.org/forum/showpost.php?p=916683&postcount=4)

majid_darab
دوشنبه 31 خرداد 1389, 03:10 صبح
فرمایش شما کاملاً درست است ...
با توجه به اینکه قسمت LogOut این پروژه خوب کار کرده شده پس درنتیجه خیلی راحت می تونیم پیغام های کاربر مربوطه در یک اتاق رو پس از خالی شدن روم پاک کنیم ...
برای اینکار اول باید جدول LoggedInUsers رو یه چک بکنیم (موقع خروج هر کاربر) و در صورتی که دیگر کاربر لاگین کرده ای مخصوص اون روم وجود نداشت می توانیم تمام رکوردهای جدول Messages را که مربوط به اون روم هستند رو پاک کنیم به استثنای مثلاً مورد زیر...
فقط می تونیم اون پیغام هایی که دو به دو بین کاربران ردوبدل شده رو نگه داریم ...(رکوردهایی که هم FrormUser و هم ToUser اونها پر است که میشه این قابلیتو به پروژه اضافه نمود(چت دو نفره).

با تشکّر

majid_darab
دوشنبه 31 خرداد 1389, 03:33 صبح
راستی textboxهای پولدار دیگه چه صیغه ایه؟
منظور Rich تکست باکس می باشد که برای استفاده از اونها مجبور می شویم ValidateRequest رو در وب PageMarkup تبدیل به False کنیم...
به توضیح داده شده در این مورد در وب لاگ اعلامی توجه نمایید...

در پروژه ای که آقا ناصر لینکشو گذاشتند برای ارتباط بین ClientSide و ServerSide از ScriptManager و EnableWebMehods = True استفاده شده که در قالب موارد این موضوع Static بودن وب متدها دست و پاگیر است و قدرت مانور را پایین می آورد ... در ضمن این موضوع در سیستم من اصلاً کار نمی کند ...

راستی چون دیگر نسل app_Code منقرض شده است اگر در پروژه ی حاضر خود پوشه ای به این نام بسازید به احتمال زیاد کلاس ها و فایل های به طور مثال LINQ ی داخل آن کار نخواهند کرد...
لذا نام پوشه ی مربوطه را به صورت دیگری انتخاب نمایید.

با تشکّر

naser2009
دوشنبه 31 خرداد 1389, 08:51 صبح
سلام
در مورد این که ذخیره کردن پیام ها و کاربران آنلاین توی database صحیحه یا نه نظر ندادید!:لبخندساده:

naser2009
دوشنبه 31 خرداد 1389, 14:25 عصر
دوستان لطفا بحث رو ادامه بدید!

majid_darab
دوشنبه 31 خرداد 1389, 17:25 عصر
ناصر جان مثل اینکه خودمو خودتیم...
در کل نظرت چی بود ؟
روی قسمت مشکل دارش دارم کار می کنم و خوب راه حل موضوع اینه که تکست باکس ورود پیام را از مد Ajax خارج کنیم که خود این موضوع داستان هایی بهمراه دارد ...
آیا شما مشکلی که من عنوان کردم را داشتید ؟

باتشکر

mskarimi
دوشنبه 31 خرداد 1389, 19:35 عصر
یه سوال چت رومی مثل چت روم جی میل هم با آژاکس هست یا از تکنولوژی دیگری استفاده کرده.
این مدل خیلی خوبیه. سبک و سریع

naser2009
دوشنبه 31 خرداد 1389, 22:40 عصر
ناصر جان مثل اینکه خودمو خودتیم...
در کل نظرت چی بود ؟
روی قسمت مشکل دارش دارم کار می کنم و خوب راه حل موضوع اینه که تکست باکس ورود پیام را از مد Ajax خارج کنیم که خود این موضوع داستان هایی بهمراه دارد ...
آیا شما مشکلی که من عنوان کردم را داشتید ؟

باتشکر
آره کلا تیک داره و این زیاد جالب نیست.
شما داری از تایمر ajax استفاده میکنی نمیشه کاری کرد که تایمر رو با توابع جاوا مثله setinterval شبیه سازی کنیم؟
و یه نکته دیگه این که توجه داشتید که در پروژه ای که گذاشتم از database استفاده نکرده بود؟

majid_darab
پنج شنبه 24 تیر 1389, 08:49 صبح
آره کلا تیک داره و این زیاد جالب نیست.
شما داری از تایمر ajax استفاده میکنی نمیشه کاری کرد که تایمر رو با توابع جاوا مثله setinterval شبیه سازی کنیم؟
و یه نکته دیگه این که توجه داشتید که در پروژه ای که گذاشتم از database استفاده نکرده بود؟


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

moj_asghary
یک شنبه 17 مرداد 1389, 16:13 عصر
ما منتظر هستیم مجید آقا !

Alireza_Salehi
یک شنبه 17 مرداد 1389, 23:39 عصر
این برنامه داره از یک UpdatePanel استفاده میکنه. callback را برای منظور دیگری استفاده کرده است.

با استفاده از javascript و XMLHttp می توانید با کارائی بسیار بسیار بالاتری بدون استفاده از UpdatePanel و Script Manager و بدون استفاده از تکنیک هایی مثل Page Callbacks یا PageMethods یک برنامه چت با امکانات فوق العاده بسازید.

با استفاده از تکنیک comet (http://www.google.com/search?hl=en&safe=off&client=firefox-a&hs=BRB&rls=org.mozilla%3Aen-US%3Aofficial&q=comet+ajax&aq=f&aqi=g6g-m1&aql=&oq=&gs_rfai=) هم می توانید امکانات بیشتری به چنین برنامه ای اضافه کنید.

majid_darab
یک شنبه 17 مرداد 1389, 23:40 عصر
من از شما و بقیه ی دوستان به خاطر تاخیر در این مورد به شدت عذرخواهی می كنم.
به چند دلیل چت بازسازی شده را در این تاپیك نگذاشتم :
1- من برای بازسازی چت روم از كنترل های تلریك استفاده كردم كه خوب این موضوع تعداد كاربرانی كه بتوانند از آن استفاده نمایند محدود می كند.
2-من از مستر و كانتنت پیج استفاده كردم كه خوب بنا به علت شماره 1 تعدادی از كدها رو در مستر پیج قرار دادم.
به نظرم اگر بخوام چت روم بازسازی شده را دراین تاپیك قرار بدم باید یه دگرگونی دیگر در آن ایجاد كنم (اگر این كار انجام نشود یه مقدار بررسی كد به دلیل وجود كدهای تلریك مشكل می شود)كه بنا بر دِینی كه نسبت به این فروم احساس می كنم به زودی این كار را انجام خواهم داد.
به هر تقدیر چت روم بدی نشد و از نظر design هم عین یاهو در آوردمش.
اما باید اینو بگم با وجود كار زیادی كه برد پس از آپلود متوجه شدم كه چت روم دیگری كه دوستمون معرفی كردن سریعتره كه بدجوری حالم گرفته شد.
البته این موضوع می تونه به دلیل سرعت تست و موارد دیگری از قبیل ذخیره و بازخوانی اطلاعات از دیتایس و احتمالاً وجود باگ هایی كه از دستم گریختن و ... باشه

به هر تقدیر چت روم دیگری كه دوستمون معرفی كردن واقعاً تر و تمیز و حرفه ای نوشته شده و از قابلیت های c# به خوبی استفاده كرده و یكی از دلایل سریعتر بودن آن اینه كه از دیتابیس خبری نیست و اطلاعات رو در رم نگه داری و بازخوانی می كنه
البته به قول یكی از دوستان میشه این مشكلو این گونه حل كرد كه پس از یك بازه ی زمانی اطلاعات رمو بریزیم تو دیتابیس در نتیجه این ارتباط دایم با هر پیغام صورت نمی گیره و در عین حال سیستم پشتیبانی هم راه می افته
در كل فایل های متنی كه حكم دیتابیسو دارن خیلی سریعترن.

به هرتقدیر باز به روی چشم.

با آرزوی سلامتی و بهترین ها
مجید داراب

Alireza_Salehi
دوشنبه 18 مرداد 1389, 00:29 صبح
من از شما و بقیه ی دوستان به خاطر تاخیر در این مورد به شدت عذرخواهی می كنم.
به چند دلیل چت بازسازی شده را در این تاپیك نگذاشتم :
1- من برای بازسازی چت روم از كنترل های تلریك استفاده كردم كه خوب این موضوع تعداد كاربرانی كه بتوانند از آن استفاده نمایند محدود می كند.
2-من از مستر و كانتنت پیج استفاده كردم كه خوب بنا به علت شماره 1 تعدادی از كدها رو در مستر پیج قرار دادم.
به نظرم اگر بخوام چت روم بازسازی شده را دراین تاپیك قرار بدم باید یه دگرگونی دیگر در آن ایجاد كنم (اگر این كار انجام نشود یه مقدار بررسی كد به دلیل وجود كدهای تلریك مشكل می شود)كه بنا بر دِینی كه نسبت به این فروم احساس می كنم به زودی این كار را انجام خواهم داد.
به هر تقدیر چت روم بدی نشد و از نظر design هم عین یاهو در آوردمش.
اما باید اینو بگم با وجود كار زیادی كه برد پس از آپلود متوجه شدم كه چت روم دیگری كه دوستمون معرفی كردن سریعتره كه بدجوری حالم گرفته شد.
البته این موضوع می تونه به دلیل سرعت تست و موارد دیگری از قبیل ذخیره و بازخوانی اطلاعات از دیتایس و احتمالاً وجود باگ هایی كه از دستم گریختن و ... باشه

به هر تقدیر چت روم دیگری كه دوستمون معرفی كردن واقعاً تر و تمیز و حرفه ای نوشته شده و از قابلیت های C#‎ به خوبی استفاده كرده و یكی از دلایل سریعتر بودن آن اینه كه از دیتابیس خبری نیست و اطلاعات رو در رم نگه داری و بازخوانی می كنه
البته به قول یكی از دوستان میشه این مشكلو این گونه حل كرد كه پس از یك بازه ی زمانی اطلاعات رمو بریزیم تو دیتابیس در نتیجه این ارتباط دایم با هر پیغام صورت نمی گیره و در عین حال سیستم پشتیبانی هم راه می افته
در كل فایل های متنی كه حكم دیتابیسو دارن خیلی سریعترن.

به هرتقدیر باز به روی چشم.

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

مشکل اصلی برنامه فوق استفاده از ASP.NET Ajax است که نسبت به تکنیک های دیگر آجاکسی کند تر است.

majid_darab
دوشنبه 18 مرداد 1389, 02:05 صبح
در یک چت روم شلوغ استفاده از فایل متنی و رم سرور اصلا به صلاح نیست، سرور شما به محض شلوغ شدن چت روم ها از کار می افتد.
دیتابیس از فایل سریع تر و بهینه تر است. ضمن این که حجم بالای رکورد ها تاثیر چندانی در سرعت دیتابیس ندارد(به شرطی که دیتابیس درست طراحی شده باشد). البته تکنیک Cacheing تاثیر خوبی روی سرعت دارد ولی به جا و به موقع.

مشکل اصلی برنامه فوق استفاده از ASP.NET Ajax است که نسبت به تکنیک های دیگر آجاکسی کند تر است.

با سلام و تشكّر از همیاری شما:
به نظرم فرمایش شما كاملاً متین و منطقی ست.چون من چت روم نوشته شده را با چند نفر بیشتر تست نكردم وخوب این موضوع سرعت در تعداد كاربر بالاس كه خوشو نشون می ده.


با تشكّر
مجید داراب