🏢 Российский разработчик ПО в сфере информационной безопасности InfoTecs предлагал такое тестовое на веб-разрабочтика 👇🏻
📝 Суть: Необходимо разработать клиент-серверное приложение, которое работало бы по следующему сценарию: ✅ клиент после запуска ожидает ввода пользователя; ✅ пользователь вводит число в клиент; ✅ клиент отправляет число на сервер; ✅ сервер раскладывает число на простые множители и отправляет клиенту ответ; ✅ клиент сообщает результат пользователю.
❗️Требования: 🔹 можно использовать только чистый Python; 🔹 методы должны быть асинхронными; 🔹 нужен тонкий клиент (браузер); 🔹 пользователь может ввести в клиенте несколько чисел, не дожидаясь получения ответов от сервера; 🔹 сервер должен поддерживать одновременное обслуживание нескольких клиентов; 🔹 исходный код должен быть хорошо оформлен, структурирован и иметь комментарии (т.е. должен быть написан так, как вы его пишете всегда).
➕ Плюсик вам в карму, если снабдите приложение модульными тестами.
· 10.01.2025
Создадим сервер и клиента, а также добавим модульные тесты. 1. Сервер:
import asyncio
async def factorize_number(number: int) -> list[int]: """Разложение числа на простые множители.""" factors = [] divisor = 2 while number > 1: while number % divisor == 0: factors.append(divisor) number //= divisor divisor += 1 return factors
async def handle_client(reader: asyncio.StreamReader, writer: asyncio.StreamWriter): """Обработка подключения клиента.""" addr = writer.get_extra_info('peername') print(f"Клиент подключен: {addr}")
async def main(): server = await asyncio.start_server(handle_client, '127.0.0.1', 8888) addr = server.sockets[0].getsockname() print(f"Сервер запущен на {addr}")
if name == "main": asyncio.run(main())
2. Клиент:
import asyncio
async def send_number(number: int): """Отправка числа серверу и получение ответа.""" reader, writer = await asyncio.open_connection('127.0.0.1', 8888) print(f"Отправка числа: {number}")
async def main(): print("Введите числа для факторизации (через Enter, завершение - пустая строка):") tasks = [] while True: try: user_input = input() if not user_input: break number = int(user_input) tasks.append(asyncio.create_task(send_number(number))) except ValueError: print("Введите корректное число.")
if name == "main": asyncio.run(main())
3. Модульные тесты:
import unittest from server import factorize_number
class TestFactorization(unittest.TestCase): def test_prime_number(self): self.assertEqual(factorize_number(7), [7])
if name == "main": unittest.main()
Запуск: 1. Запустите сервер 2. Запустите клиента 3. Введите числа в клиенте. Сервер обработает запросы параллельно.
Что реализовано: -Асинхронные методы (asyncio) как в сервере, так и в клиенте. -Тонкий клиент на основе командной строки (можно адаптировать под веб-интерфейс, например, с использованием aiohttp). -Возможность отправки нескольких чисел без ожидания ответа. -Одновременная поддержка нескольких клиентов. -Модульные тесты.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён