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