Skip to content

50. (П22) Неблокуючий ехо-сервер на сокетах

Передумови

Персоналізація

Оголосіть константу 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"") — сервер його коректно прибирає (unregisterclose).
  • На Ctrl+C друкує server stopped і завершується без traceback.

Лог сервера — один рядок на подію:

  • connected: <ip>:<port>
  • <- <ip>:<port>: <msg>
  • -> <ip>:<port>: [<n>] <msg>
  • disconnected: <ip>:<port>

Тестування

Тест 1. Один клієнт

$ nc 127.0.0.1 9100
Hello from Imya Prizvysche!
hello
[1] hello
world
[2] world
^C

Тест 2. Кілька клієнтів одночасно — головна перевірка

Це ключовий експеримент, що демонструє перевагу неблокуючої моделі.

  1. Відкрийте три термінали, у кожному запустіть nc 127.0.0.1 9100. Усі три мають побачити вітання одразу.
  2. У першому терміналі нічого не пишіть.
  3. У другому введіть hello — отримайте [1] hello.
  4. У третьому введіть world — отримайте [1] world.

У блокуючому сервері (практичне 48) другий і третій клієнти чекали б, поки відключиться перший. Тут вони обслуговуються негайно — це і є те, заради чого ми писали неблокуючу версію.

Тест 3. Ctrl+C

Натисніть Ctrl+C на сервері — має надрукуватись server stopped. Повторний запуск не падає з Address already in use.

Результат

Здайте звіт, де є:

  • Скріншот сесії з трьох одночасних nc-клієнтів, де видно, що другий і третій клієнти отримують відповіді, поки перший мовчить.
  • Скріншот логу сервера з Student: <Імʼя> і перемішаними подіями від різних клієнтів.

Знайшли помилку чи бажаєте додати інформацію, щоб покращити курс? Створіть issue на GitHub