50. (П22) Неблокуючий ехо-сервер на сокетах¶
Передумови¶
- Прочитана Лекція 49 — Основи роботи з неблокуючими сокетами
- Виконане Практичне 48 — Блокуючий ехо-сервер
- Утиліта
nc(netcat)
Персоналізація
Оголосіть константу STUDENT = "Imya Prizvysche" (ваші дані латиницею) і виводьте її у першому рядку запуску: print(f"Student: {STUDENT}"). Це ім'я також має йти у вітальному повідомленні до кожного клієнта.
Завдання¶
Написати неблокуючий TCP ехо-сервер на selectors, який одним потоком обслуговує кількох клієнтів одночасно. Файл — echo_server_nb.py.
Поведінка:
- Слухає на
127.0.0.1:9100,SO_REUSEADDRпередbind,listen(128). - Одразу після
acceptнадсилає клієнту вітання:Hello from <STUDENT>!\n. - Далі для кожного отриманого повідомлення відправляє назад
[<n>] <msg>\n, деn— лічильник повідомлень для цього клієнта (з 1). - Коли клієнт закриває з'єднання (
recvповертаєb"") — сервер його коректно прибирає (unregister→close). - На
Ctrl+Cдрукуєserver stoppedі завершується без traceback.
Лог сервера — один рядок на подію:
connected: <ip>:<port><- <ip>:<port>: <msg>-> <ip>:<port>: [<n>] <msg>disconnected: <ip>:<port>
Тестування¶
Тест 1. Один клієнт¶
Тест 2. Кілька клієнтів одночасно — головна перевірка¶
Це ключовий експеримент, що демонструє перевагу неблокуючої моделі.
- Відкрийте три термінали, у кожному запустіть
nc 127.0.0.1 9100. Усі три мають побачити вітання одразу. - У першому терміналі нічого не пишіть.
- У другому введіть
hello— отримайте[1] hello. - У третьому введіть
world— отримайте[1] world.
У блокуючому сервері (практичне 48) другий і третій клієнти чекали б, поки відключиться перший. Тут вони обслуговуються негайно — це і є те, заради чого ми писали неблокуючу версію.
Тест 3. Ctrl+C¶
Натисніть Ctrl+C на сервері — має надрукуватись server stopped. Повторний запуск не падає з Address already in use.
Результат¶
Здайте звіт, де є:
- Скріншот сесії з трьох одночасних
nc-клієнтів, де видно, що другий і третій клієнти отримують відповіді, поки перший мовчить. - Скріншот логу сервера з
Student: <Імʼя>і перемішаними подіями від різних клієнтів.
Знайшли помилку чи бажаєте додати інформацію, щоб покращити курс? Створіть issue на GitHub