Перейти к содержанию

Задание №2

Задание

Реализовать клиентскую и серверную часть приложения. Клиент запрашивает у сервера выполнение математической операции, параметры, которые вводятся с клавиатуры. Сервер обрабатывает полученные данные и возвращает результат клиенту. Вариант - Поиск площади трапеции.

Обязательно использовать библиотеку socket
Реализовать с помощью протокола TCP

server.py
import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("127.0.0.1", 8080))
server_socket.listen(10)
server_socket.settimeout(0.5)

try:
    while True:
        try:
            client_socket, address = server_socket.accept()
            client_socket.send(
                "Введите через запятую без пробелов значения a, b и c, "
                "где a и b - основания трапеции, а h - высота.".encode()
            )

            data = client_socket.recv(1024).decode()
            a, b, h = (float(num) for num in data.split(","))
            area = (a + b) / 2 * h

            client_socket.send(f"Площадь трапеции: {area}".encode())

        except socket.timeout:
            pass

except KeyboardInterrupt:
    server_socket.close()
  • Создаём объект сокета с помощью socket.socket(socket.AF_INET, socket.SOCK_DGRAM), где socket.AF_INET отвечает за IPv4, а socket.SOCK_STREAM за протокол TCP.
  • Задаём .timeout, чтобы дать возможность программе поймать Ctrl+C.
  • С помощью .accept принимаем соединение клиента.
  • С помощью .send отправляем пользователю информационное сообщение о требуемом вводе.
  • С помощью .recv получаем данные, проводим вычисления и отправляем результат обратно так же с помощью .send.
  • Оборачиваем полученный код в try-except socket.timeout, чтобы таймаут не завершил работу сервера.
  • Оборачиваем этот try-except в цикл while True, чтобы сервер не прекратил работу после обработки первого запроса.
  • Оборачиваем цикл в try-except KeyboardInterrupt, чтобы можно было завершить работу сервера по нажатию на Ctrl+C.
client.py
import socket


client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("127.0.0.1", 8080))

question = client_socket.recv(1024).decode()
print(question)
abh = input()

client_socket.send(abh.encode())
result = client_socket.recv(1024).decode()
print(result)

client_socket.close()
  • Создаём объект сокета с помощью socket.socket(socket.AF_INET, socket.SOCK_DGRAM), где socket.AF_INET отвечает за IPv4, а socket.SOCK_STREAM за протокол TCP.
  • Подключаемся к серверу через .connect.
  • С помощью .recv получаем информационное сообщение.
  • Через input() вводим необходимые значения, перечисленные через запятую.
  • Отправляем на сервер с помощью .send и получаем результат с помощью .recv.
  • Закрываем соединение с помощью .close.

Консоль клиента
Консоль клиента