میخواهیم به کمک شما قسمت سرور یک پیام رسان را طراحی کنیم.
این سرور قابلیت عضو شدن (یا register)، و برای افرادی که عضو شده اند قابلیت ورود (یا login) و برای افرادی که وارد شده قابلیت خروج (یا logout) را داشته باشد. همچنین این سرور قابلیت ارسال پیام از یک کاربر به کاربر دیگر را نیز دارد و همچنین برای هر کاربر قابلیت دریافت همه پیام های ارسالی را داشته باشد.
برای برقراری ارتباط کلاینت ها پیام ها را به `port` شماره `1234` میفرستند و سرور باید به این port گوش بدهد تا کلاینت ها به آن متصل شوند.
بعد از برقراری ارتباط کلاینت با سرور هر بار که کلاینت یک درخواست میکند، سرور نیز یک یا چند پیام (بسته به نوع پیام فرستاده شده) ارسال میکند.
منظور از یک پیام یک رشته از هر کاراکتری (حتی فاصله) است.
----------
# درخواست register
این پیام حاوی دو رشته است که به ترتیب نشان دهنده نام کاربری (یا username) و کلمه عبور (یا password) است. درصورت عدم وجود کاربری با این نام کاربری، این سرور یک حساب کاربری جدید ایجاد میکند و پیام `"you registered successfully"` را به کلایت ارسال میکند.
فرمت درخواست:
`register username password`
مثال درخواست:
`register mohammad pa3word`
در صورت وجود کاربری با نام کاربری مشابه، این درخواست انجام نمیشود و سرور پیام `"this username registered"` را به کلاینت ارسال میکند.
تضمین میشود دو رشته نام کاربری یا username و رمزعبور یا password شامل حداقل 3 کاراکتر و حداکثر 10 کاراکتر از حروف کوچک و بزرگ انگلیسی و ارقام باشد.
----------
# درخواست login
این پیام حاوی دو رشته است که به ترتیب نشان دهنده نام کاربری (یا username) و رمز عبور (یا password) است. در صورت ثبت نام (یا register) بودن این نام کاربری و مطابق بودن رمزعبور با آن، سرور باید یک رشته به نام session که تاکنون برای هیچ کاربری ارسال نشده است را ایجاد و برای کلاینت ارسال کند. توجه کنید که رشته session باید شامل 30 کاراکتر از ارقام باشد.
فرمت درخواست:
`login username password`
مثال درخواست:
`login mohammad pa3word`
در صورت عدم تطابق نام کاربری با رمزعبور یا عدم ثبت نام این نام کاربری سرور پیام `"wrong username or password"` را به کلاینت ارسال میکند.
----------
# درخواست logout
این پیام حاوی یک رشته است که نشان دهنده session است. در صورت وجود کاربری با آن session فعال (یعنی این session را login کرده و هنوز logout نکرده است.) این session را از مجموعه session های فعال این کاربر خارج میکند و سرور پیام `"your session logout successfully"` را به کلاینت ارسال میکند.
فرمت درخواست:
`logout session`
مثال درخواست:
`logout 987654321098765432109876543210`
در صورت عدم وجود چنین session سرور پیام `"invalid session"` را به کلاینت ارسال میکند.
----------
# درخواست send
این پیام حاوی سه رشته session و username و message است و در صورت معتبر session و وجود یک کاربر با نام کاربری username ، پیام message را به همه session های فعال آن کاربر ارسال کند.
فرمت درخواست:
`send session_of_sender contact_username message`
مثال درخواست:
`send 987654321098765432109876543210 ali salam baraadar`
فرمت پیامی که باید برای کلاینت ارسال کنید:
`sender: message`
مثال فرمت پیام:
`ali: salam baraadar`
در صورت معتبر نبودن session سرور پیام `"invalid session"` را به کلاینت اسال میکند.
در صورت عدم وجود کاربردی با نام کاربری username باید پیام `"your contact did not register"` توسط سرور ارسال شود.
و در صورت موفقیت آمیز بودن ارسال پیام `"your message send successfully"` ارسال شود.
----------
# درخواست receive
این پیام حاوی یک رشته session است و در صورت معتبر بودن session، ابتدا تعداد پیام هایی که به این کاربر ارسال شده ولی این session هنوز دریافت نکرده است را به او ارسال میکند. سپس به همان تعداد پیام برای کلاینت ارسال می شود.
فرمت این درخواست:
`receive 987654321098765432109876543210`
فرمت پیام هایی که برای کلاینت ارسال میشود:
`number_of_message$sender: message_1$sender: message_2`
مثال پیام هایی که برای کلاینت ارسال می شود:
`2$mahdi: salam$mahdi: khubi?`
(هر رشته بین `$` یک پیام ارسال شده است.)
توجه کنید حتی در صورت وجود یک پیام هم باید تعداد پیام ها ارسال شود.
در صورت معتبر نبودن session سرور پیام `"invalid session"` را به کلاینت اسال میکند.
----------
# محدودیت
تضمین می شود حداکثر 20 کاربر به سرور متصل خواهد شد و حداکثر 50 درخواست داده میشود و طول پیام ها حداکثر 20 کاراکتر است.
----------
# نحوه ارسال
اگر به زبان python میفرستید تعدادی فایل که فایل اصلی که اجرا میشود `server.py` است. برای این کار پروژه خود را zip کرده به صورتی که `server.py` در ریشه فایل zip قرار گیرد.
اگر به زبان java میفرستید تعدادی فایل که فایل اصلی که اجرا میشود `server.java` است. برای این کار پروژه خود را zip کرده به صورتی که `server.java` در ریشه فایل zip قرار گیرد.
اگر به زبان c++ میفرستید تعدادی فایل که فایل اصلی که اجرا میشود `server.cpp` است. برای این کار پروژه خود را zip کرده به صورتی که `server.cpp` در ریشه فایل zip قرار گیرد. توجه کنید که قبل از اجرا دستور `make` صدا زده میشود و فایل `server.cpp` باید به فایل اجرایی `server` تبدیل شود.
اگر به زبان c# میفرستید یک پروژه باید داشته باشیم که نام این پروژه `server` است این پروژه را به صورتی zip کنید که فایل `server.csproj` در ریشه فایل zip قرار گیرد.
فایل zip را ارسال کنید.