diff --git a/.env b/.env index 2d7350a..d99753b 100644 --- a/.env +++ b/.env @@ -1 +1,2 @@ -GITEA_TOKEN=95a566ecc1f4d473981658babb9c6b5f2c7b124e \ No newline at end of file +GITEA_TOKEN_READ=54f48897b1672651d5f1ef905dd5a7c252330796 +GITEA_TOKEN_WRITE=3813cb2cc9bd74f9db7884266b6ddffe96aa2e6e \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..d0bdaf9 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/seti.iml b/.idea/seti.iml new file mode 100644 index 0000000..d0876a7 --- /dev/null +++ b/.idea/seti.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..3d4bef1 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# Работа с сетевыми соединениями в Python + +## Описание проекта + +Практическая работа по изучению основ работы с сетевыми соединениями в Python. +Реализованы клиент-серверные приложения по протоколам TCP и UDP, выполнен анализ сетевого трафика в Wireshark, проведено сравнение HTTP-запросов через socket и requests, а также выполнено взаимодействие с API Gitea. + +--- + +## Используемые протоколы и методы + +| Протокол/метод | Назначение | +|----------------|------------| +| **TCP** | Надёжная передача данных с установкой соединения | +| **UDP** | Быстрая передача данных без установки соединения | +| **HTTP (socket)** | Низкоуровневая отправка HTTP-запросов | +| **HTTP (requests)** | Высокоуровневая работа с HTTP-запросами | +| **Gitea API** | Взаимодействие с Git-сервером через REST API | +| **Wireshark** | Анализ сетевого трафика | + +1. **TCP vs UDP** + - TCP надёжный, но медленный. Используется для веб-сайтов, почты, файлов. + - UDP быстрый, но может терять данные. Используется для видео, игр, звонков. + +2. **socket vs requests** + - `requests` удобнее для реальной разработки: автоматические заголовки, редиректы, меньше кода. + - `socket` подходит для низкоуровневого контроля и изучения протокола HTTP. + +3. **Анализ Wireshark** + - Зафиксировано трёхстороннее рукопожатие TCP (SYN, SYN-ACK, ACK) + - Зафиксирована передача данных с флагом PSH, ACK + - Зафиксировано завершение соединения (FIN, ACK) + - В UDP подтверждено отсутствие установки соединения + +4. **API Gitea** + - Токены должны храниться в `.env` и не попадать в Git + - Для чтения нужны права `read:user` + - Для создания репозитория нужны права `write:repository` \ No newline at end of file diff --git a/gitea_api.py b/gitea_api.py index ff608db..d5813e1 100644 --- a/gitea_api.py +++ b/gitea_api.py @@ -4,18 +4,20 @@ from dotenv import load_dotenv load_dotenv() -TOKEN = os.getenv("GITEA_TOKEN") +TOKEN_READ = os.getenv("GITEA_TOKEN_READ") +TOKEN_WRITE = os.getenv("GITEA_TOKEN_WRITE") -if not TOKEN: - print("Ошибка: токен не найден. Создайте файл .env с GITEA_TOKEN=ваш_токен") +if not TOKEN_READ: + print("Ошибка: токен для чтения не найден. Добавьте GITEA_TOKEN_READ в .env") exit(1) -headers = {"Authorization": f"token {TOKEN}"} +headers_read = {"Authorization": f"token {TOKEN_READ}"} print("=" * 50) print("Проверка подключения к Gitea API") print("=" * 50) -response = requests.get("https://git.vyatsu.ru/api/v1/user", headers=headers) + +response = requests.get("https://git.vyatsu.ru/api/v1/user", headers=headers_read) if response.status_code == 200: user_info = response.json() @@ -26,4 +28,39 @@ if response.status_code == 200: print(f"ID: {user_info.get('id')}") else: print(f"Ошибка: {response.status_code}") + print(response.text) + exit(1) + +# ============================================ +# СОЗДАНИЕ РЕПОЗИТОРИЯ +# ============================================ + +if not TOKEN_WRITE: + print("\n⚠️ Токен для записи не найден. Пропускаем создание репозитория.") + exit(0) + +headers_write = {"Authorization": f"token {TOKEN_WRITE}"} + +print("\n" + "=" * 50) +print("Создание нового репозитория") +print("=" * 50) + +repo_data = { + "name": "my-lab3-repo", + "description": "Создано через API Gitea", + "private": False +} + +response = requests.post( + "https://git.vyatsu.ru/api/v1/user/repos", + headers=headers_write, + json=repo_data +) + +if response.status_code == 201: + print(f"✅ Репозиторий создан: {response.json()['html_url']}") +elif response.status_code == 422: + print("⚠️ Репозиторий с таким именем уже существует") +else: + print(f"❌ Ошибка: {response.status_code}") print(response.text) \ No newline at end of file diff --git a/http_socket.py b/http_socket.py index ca2d3e6..a6b6f99 100644 --- a/http_socket.py +++ b/http_socket.py @@ -3,9 +3,19 @@ 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" +request = ( + "GET / HTTP/1.1\r\n" + "Host: vyatsu.ru\r\n" + "User-Agent: python-requests/2.32.3\r\n" + "Accept-Encoding: gzip, deflate\r\n" + "Accept: */*\r\n" + "Connection: keep-alive\r\n" + "\r\n" +) + client.sendall(request.encode()) +# Получаем ответ response = b"" while True: data = client.recv(4096) diff --git a/tcp_client.py b/tcp_client.py index 8bf9fdd..972bd8b 100644 --- a/tcp_client.py +++ b/tcp_client.py @@ -9,4 +9,8 @@ client.sendall(message.encode()) data = client.recv(1024) print(f"Ответ от сервера: {data.decode()}") +# Если отправили STOP - сервер завершит работу +if message.upper() == "STOP": + print("Команда STOP отправлена, сервер завершает работу") + client.close() \ No newline at end of file diff --git a/tcp_server.py b/tcp_server.py index 07b04af..85e0de2 100644 --- a/tcp_server.py +++ b/tcp_server.py @@ -3,24 +3,22 @@ import socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(("0.0.0.0", 10000)) server.listen(1) -print("TCP сервер запущен на порту 10000") +print("TCP сервер запущен") while True: conn, addr = server.accept() print(f"Подключение от {addr}") - + data = conn.recv(1024) if not data: break - response = data.upper() - conn.sendall(response) - print(f"Отправлено: {response}") - + conn.sendall(data.upper()) conn.close() - - if response == b'EXIT': - print("Завершение сервера") + + if data.upper() == b'STOP': + print("Получена команда STOP, сервер завершает работу") break -server.close() \ No newline at end of file +server.close() +print("Сервер остановлен") \ No newline at end of file