در این سوال میخوایم یک پیام رسان ساده با استفاده از گولنگ پیاده سازی کنیم. فقط این پیام رسان برای آن دسته از افرادی است که خیلی حوصله فضای مجازی را ندارند و دوست ندارند هربار که وارد برنامه میشوند با تعداد زیادی از پیامهای جدید رو به رو شوند و به جایش دوست دارند هربار که خودشان خواستند سرور یکی از پیامهای جدیدشان را (در صورت وجود) برایشان نمایش دهد.
پروژهی اولیه را از این لینک دانلود کنید. ساختار فایلهای پروژه به صورت زیر است:
در هر کدام از فایلهای go توابع و استراکتهایی وجود دارد که باید کاملشان کنید که در ادامه به آنها خواهیم پرداخت.
در این پروژه هر کاربر میتواند به کاربر یا گروهی دیگر پیام ارسال کند. فقط برای ارسال پیام از سمت سرور به گیرنده چندتا شرط وجود دارد.
subscribed
باشد یا نباشد که با توجه به این ویژگی عدد n برای هر پیام از طرف او مشخص میشود. به این صورت که اگر subscribed
باشد سرور هر 110 میلی ثانیه یک بار سعی میکند پیام او را به گیرنده بفرستد و اگر subscribed
نباشد هر 290 میلی ثانیه یک بار. دقت کنید که این تایمر از زمان فرستادن هر پیام شروع میشود (یعنی هر پیام تایمر جدا دارد). همچنین هر بار 1 میلی ثانیه از مدت زمان تایمر کم میشود. یعنی اگر پیامی اولین بار پس از 110 میلی ثانیه سعی شود فرستاده شود و ناموفق بوده باشد (گیرنده پیام خوانده نشده از قبل داشته)، دفعه بعد پس از 109 میلی ثانیه دوباره سرور تلاش میکند ارسالش کند.message.go
🔗در این فایل استراکت حاوی اطلاعات پیامها وجود دارد که نباید آن را تغییر بدهید.
فیلد اول نشان دهنده آیدی کاربر فرستنده است. فیلد دوم آیدی کاربر گیرنده. فیلد سوم متن پیام است. فیلد چهارم نشان دهنده زمانی است که طول کشیده است تا پیام به سمت گیرنده ارسال شود (به میلی ثانیه). درباره فیلد آخر دقت کنید که هربار سرور سعی میکند پیام را به گیرنده ارسال کند باید آپدیت شود (یعنی با زمان سیستم نباید کار کنید).
server.go
🔗در این فایل استراکت زیر وجود دارد که باید خودتان کامل کنید.
همچنین تابع زیر را داریم که لیست کاربر و گروهها را میگیرد و سرور را برمیگرداند.
در ادامه تابع زیر را داریم که باید لیستی از پیامهای موجود در صف سرور در آن لحظه را برگرداند. خروجی این تابع، ترتیبدار است. به این ترتیب پیامی که اول ارسال شده است باید اول لیست باشد.
توجه: برای سرور امکان add و remove گروهها و کاربرها را نداریم. به این معنی که همان اطلاعاتی که موقع setup داشتیم، تا آخر برنامه معتبر است.
user.go
🔗این فایل شامل دو دسته از استراکتها و توابع است که باید آنها را پیاده سازی کنید. قسمت اول مربوط به کاربرها است.
تابع NewUser
دو مقدار به عنوان ورودی میگیرد. اولی آیدی کاربر است. دومی یک بولین است که نشان میدهد این کاربر جز کاربرهای subscribed
است یا خیر. در آخر یوزر ساخته شده را برمیگرداند.
تابع SendMessage
نیز دو مقدار به عنوان ورودی میگیرد. اولی آیدی کاربر گیرنده و دومی متن پیام است. همچنین اگر آیدی گیرنده در سرور وجود نداشت، این تابع باید یک ارور برگرداند (متن ارور مهم نیست).
تابع ReceiveMessage
: این تابع در صورت وجود پیام جدید برای کاربر، آن را برمیگرداند. در غیر این صورت یک استراکت خالی برمیگرداند
قسمت دوم مربوط به گروهها است (که کاربرها میتوانند عضو آنها شوند)
تابع NewGroup
: آیدی گروه و لیست کاربرهای موجود در این گروه را میگیرد. تضمین میشود آیدی هیچ گروهی با هیچ کاربری یکسان نیست.
تابع AddUser
: یک کاربر را میگیرد و به گروه اضافه میکند. اگر کاربر در گروه نبود و با موفقیت به گروه اضافه شد رشته بالا و اگر از قبل عضو گروه بود رشته پایین را برمیگرداند.
تابع RemoveUser
: این تابع کاربر را از گروه حذف میکند. اگر کاربر در گروه بود و حذف شد پیام بالا و اگر اصلا عضو گروه نبود پیام پایین را برمیگرداند.
درباره فرستادن پیام به گروهها:
ToID
آن برابر آیدی گروه است) و هروقت به همه اعضای گروه ارسال شد از صف حذف میشود. همچنین هربار که این پیام به یکی از اعضای گروه ارسال میشود، فیلد MsInQueueBeforeBeingSent
این پیام در صف آپدیت میشود. به این معنی که اگر پیام برای بعضی از اعضا در 110 میلی ثانیه ارسال شد، این فیلد 110 میشود و... بدیهی است اگر پیام در یک زمان به همه اعضا ارسال شود از queue حذف میشود و دیگر به این پیام دسترسی نخواهیم داشت و نیازی به آپدیت این فیلد نیست.SendMessage
لازم است چک کنید آیدی گیرنده در سرور وجود دارد یا خیر.یک فایل زیپ آپلود کنید که وقتی آن را باز میکنیم دایرکتوریهای user
که شامل user.go
است و server
که شامل server.go
است را میبینیم.