آموزش NODE.JS – توسعه یک سرور

آموزش NODE.JS – توسعه یک سرور

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

 

ما در مثال قبل سرور خود را بطور عادی اجرا کردیم و با استفاده از Telnet اتصال چندین کاربر به برنامه خود را شبیه سازی کردیم، اما وقتی اتصال کاربر در کنسول دوم قطع (disconnect) می شود، اینجاست که با یک مشکل کوچک روبرو می شویم. در این مورد هرگاه کنسول سوم پیامی را ارسال می کند، سرور سعی می کند که پیام را به یک کلاینتی که ارتباطش قطع شده ارسال کند. هرگاه کلاینت شماره دوم قطع می شود دیگر امکان دریافت و ارسال آن متوقف می شود. وقتی سعی داشته باشیم write() را در سوکتی که بسته شده است فراخوانی کنیم، یک استثنا (exception) در فرایند Node به ما نشان داده می شود. این نیز باعث می شود اتصال تمام کلاینت ها قطع شود. پس کاملا مشخص است این مساله بسیار شکننده و غیر قابل قبول برای یک سرور است.

 

ما باید این را به دو روش حل کنیم. ابتدا، باید مطمئن شویم که هرگاه یک کلاینت اتصالش قطع می شود، آن را از لیست clients که یک آرایه است حذف می کنیم، بنابراین این کار باعث می شود فراخوانی write() متوقف شود. این کار همچنین به V8 اجازه داده می شود تا شی سوکت را جمع آوری کند و حافظه را اصلاح کند تا برنامه از حافظه بیشتر استفاده نکند. دوم، ما باید کمی مراقب ارسال به یک سوکت باشیم. ما باید مطمئن شویم که بین آخرین سوکت ارسال شده و جاری، هیچ چیزی باعث متوقف ساختن ما از فراخوانی write() نمی شود. خوشبختانه، Node روش های آسانی برای انجام هر دوی اینها ارائه می دهد.

 

 

ابتدا اجازه دهید که با کاربرانی که disconnect شده اند برخورد کنیم. هرگاه کلاینتی ارتباطش قطع می شود، باید آن را از لیست clients حذف کنیم. این کار را به سادگی با رویداد end انجام می دهیم. هرگاه یک سوکت disconnect می شود، رویداد end اجرا می شود. ما همچنین با فراخوانی Array.splice() آن کلاینت را از آرایه clientList حذف می کنیم. با استفاده از Array.indexOf() ما قادر هستیم که موقعیت کلاینت را پیدا و آن را از آرایه حذف کنیم. حال وقتی clinet بعدی از فراخوانی broadcast  استفاده کند، کلاینت disconnect شده دیگر در لیست نخواهد بود تا پیام دریافت و ارسال کند.

 

 

با اضافه کردن قابلیت بررسی وضعیت ارسال برای سوکت، ما می توانیم مطمئن شویم که هر سوکتی که قابلیت دریافت و ارسال را ندارد یک exception ایجاد نکند. علاوه بر این، می توانیم مطمئن شویم هر سوکتی که نمی تواند ارسال کند با استفاده از Socket.destroy() بسته شود و آنگاه از clientList حذف شود. حال سرور ما بسیار قوی تر شده است. تنها یک چیز وجود دارد، و آن نمایش خطاها می باشد.

 

 

با اضافه کردن console.log() به رویداد error برای شی client، ما می توانیم  این اطمینان را داشته باشیم که هر گونه خطا برای کلاینت رخ دهد نمایش داده می شود.

 

امیدوارم تا اینجا توانسته باشید یک سرور بهتر از من توسعه داده باشید و از آن برای انجام کارهای باحال استفاده کنید. در بخش بعدی با هم یک برنامه جذابتر را با Node.js درست می کنیم. 😉