From 0bbdad4a4b05fbdab02d0bc92887c3ced71af373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B3=D0=BE=D1=80=20=D0=91=D0=B0=D1=82=D0=BC=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2?= Date: Sat, 11 Apr 2026 11:15:16 +0300 Subject: [PATCH] Lab 3: TCP/UDP servers, HTTP clients, Gitea API integration - repo created successfully --- .gitignore | 24 ++++++++++++++++++++++++ README.md | 13 +++++++++++++ gitea_api.py | 27 +++++++++++++++++++++++++++ http_requests_client.py | 4 ++++ http_socket_client.py | 17 +++++++++++++++++ tcp_client.py | 12 ++++++++++++ tcp_server.py | 29 +++++++++++++++++++++++++++++ udp_client.py | 11 +++++++++++ udp_server.py | 22 ++++++++++++++++++++++ 9 files changed, 159 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 gitea_api.py create mode 100644 http_requests_client.py create mode 100644 http_socket_client.py create mode 100644 tcp_client.py create mode 100644 tcp_server.py create mode 100644 udp_client.py create mode 100644 udp_server.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..74654f3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Виртуальные окружения +venv/ +env/ +.env + +# Файлы Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python + +# IDE +.vscode/ +.idea/ + +# Операционные системы +.DS_Store +Thumbs.db + +# Логи и временные файлы +*.log +tmp/ +temp/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..6d8460f --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +# Работа с сетевыми соединениями в Python + +Лабораторная работа №3 по сетям. + +## Описание +Реализация TCP/UDP клиентов и серверов, анализ трафика в Wireshark, работа с HTTP и API Gitea. + +## Установка +1. Клонируйте репозиторий. +2. Создайте и активируйте виртуальное окружение: + ```bash + python -m venv venv + .\venv\Scripts\Activate.ps1 # для Windows PowerShell \ No newline at end of file diff --git a/gitea_api.py b/gitea_api.py new file mode 100644 index 0000000..13ef4e4 --- /dev/null +++ b/gitea_api.py @@ -0,0 +1,27 @@ +import os +import requests +from dotenv import load_dotenv + +# Загружаем переменные из .env файла +load_dotenv() + +TOKEN = os.getenv("GITEA_TOKEN") +if not TOKEN: + raise ValueError("Токен Gitea не найден. Проверьте файл .env") + +headers = {"Authorization": f"token {TOKEN}"} + +# Получаем информацию о пользователе +response = requests.get("https://git.vyatsu.ru/api/v1/user", headers=headers) +print("Информация о пользователе:") +print(response.json()) + +# Пример создания репозитория (раскомментируйте, если нужно) +repo_data = { + "name": "test-repo-from-api", + "description": "Репозиторий созданный через API", + "private": False +} +response = requests.post("https://git.vyatsu.ru/api/v1/user/repos", json=repo_data, headers=headers) +print("\nСоздание репозитория:") +print(response.status_code, response.json()) \ No newline at end of file diff --git a/http_requests_client.py b/http_requests_client.py new file mode 100644 index 0000000..fd85bb3 --- /dev/null +++ b/http_requests_client.py @@ -0,0 +1,4 @@ +import requests + +response = requests.get("http://vyatsu.ru") +print(response.text[:500]) # Первые 500 символов ответа \ No newline at end of file diff --git a/http_socket_client.py b/http_socket_client.py new file mode 100644 index 0000000..e5f64d1 --- /dev/null +++ b/http_socket_client.py @@ -0,0 +1,17 @@ +import socket + +client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +client.connect(('vyatsu.ru', 80)) + +request = "GET / HTTP/1.1\r\nHost: vyatsu.ru\r\nConnection: close\r\n\r\n" +client.sendall(request.encode()) + +response = b"" +while True: + chunk = client.recv(4096) + if not chunk: + break + response += chunk + +print(response.decode(errors='ignore')) +client.close() \ No newline at end of file diff --git a/tcp_client.py b/tcp_client.py new file mode 100644 index 0000000..a1aecb0 --- /dev/null +++ b/tcp_client.py @@ -0,0 +1,12 @@ +import socket + +client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +client.connect(('127.0.0.1', 10000)) + +message = input("Введите сообщение для отправки серверу (или 'EXIT' для выхода): ") +client.sendall(message.encode()) + +data = client.recv(1024) +print(f"Ответ от сервера: {data.decode()}") + +client.close() \ No newline at end of file diff --git a/tcp_server.py b/tcp_server.py new file mode 100644 index 0000000..79da7eb --- /dev/null +++ b/tcp_server.py @@ -0,0 +1,29 @@ +import socket + +server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +server.bind(("0.0.0.0", 10000)) +server.listen(1) +print("TCP сервер запущен на порту 10000...") + +while True: + conn, addr = server.accept() + print(f"Подключение от {addr}") + + data = conn.recv(1024) + if not data: + break + + # Модифицируем данные: переводим в верхний регистр + modified_data = data.upper() + conn.sendall(modified_data) + + # Если клиент отправил 'EXIT' — завершаем сервер + if modified_data == b'EXIT': + print("Получена команда EXIT. Сервер завершает работу.") + conn.close() + break + + conn.close() + +server.close() +print("Сервер остановлен.") \ No newline at end of file diff --git a/udp_client.py b/udp_client.py new file mode 100644 index 0000000..cf64ffa --- /dev/null +++ b/udp_client.py @@ -0,0 +1,11 @@ +import socket + +client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + +message = input("Введите сообщение для отправки UDP-серверу (или 'EXIT' для выхода): ") +client.sendto(message.encode(), ('127.0.0.1', 10001)) + +data, _ = client.recvfrom(1024) +print(f"Ответ от сервера: {data.decode()}") + +client.close() \ No newline at end of file diff --git a/udp_server.py b/udp_server.py new file mode 100644 index 0000000..e13ba01 --- /dev/null +++ b/udp_server.py @@ -0,0 +1,22 @@ +import socket + +server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +server.bind(('0.0.0.0', 10001)) +print("UDP сервер запущен на порту 10001...") + +while True: + data, addr = server.recvfrom(1024) + print(f"Сообщение от {addr}: {data.decode()}") + + # Модифицируем данные: переводим в верхний регистр + modified_data = data.upper() + server.sendto(modified_data, addr) + + # Опционально: можно добавить условие выхода, но UDP не имеет "соединения" + # Например, если получили 'EXIT' — выходим + if modified_data == b'EXIT': + print("Получена команда EXIT. Сервер завершает работу.") + break + +server.close() +print("UDP сервер остановлен.") \ No newline at end of file