Lab 3: TCP/UDP servers, HTTP clients, Gitea API integration - repo created successfully

This commit is contained in:
Егор Батманов 2026-04-11 11:15:16 +03:00
commit 0bbdad4a4b
9 changed files with 159 additions and 0 deletions

24
.gitignore vendored Normal file
View File

@ -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/

13
README.md Normal file
View File

@ -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

27
gitea_api.py Normal file
View File

@ -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())

4
http_requests_client.py Normal file
View File

@ -0,0 +1,4 @@
import requests
response = requests.get("http://vyatsu.ru")
print(response.text[:500]) # Первые 500 символов ответа

17
http_socket_client.py Normal file
View File

@ -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()

12
tcp_client.py Normal file
View File

@ -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()

29
tcp_server.py Normal file
View File

@ -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("Сервер остановлен.")

11
udp_client.py Normal file
View File

@ -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()

22
udp_server.py Normal file
View File

@ -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 сервер остановлен.")