lab3/README.md
2026-05-07 16:28:02 +03:00

141 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Лабораторная работа 3
Тема: работа с сетевыми соединениями в Python.
В проекте реализованы простые примеры TCP, UDP, HTTP-запросов через `socket` и `requests`, а также пример запроса к API Gitea.
## Подготовка
Создать и активировать виртуальное окружение:
```powershell
python -m venv .venv
.\.venv\Scripts\Activate.ps1
```
Установить зависимости:
```powershell
pip install -r requirements.txt
```
## TCP
Сервер:
```powershell
python tcp_server.py
```
Клиент:
```powershell
python tcp_client.py "hello server"
```
Чтобы остановить TCP-сервер:
```powershell
python tcp_client.py EXIT
```
TCP-сервер работает на порту `10000`. Он принимает сообщение, переводит его в верхний регистр и возвращает клиенту.
Фильтр Wireshark:
```text
tcp.port==10000
```
## UDP
Сервер:
```powershell
python udp_server.py
```
Клиент:
```powershell
python udp_client.py "hello server"
```
Чтобы остановить UDP-сервер:
```powershell
python udp_client.py EXIT
```
UDP-сервер работает на порту `10001`. Он принимает сообщение, переворачивает строку и возвращает клиенту.
Фильтр Wireshark:
```text
udp.port==10001
```
## HTTP через socket
```powershell
python http_socket_client.py
```
Программа вручную открывает TCP-соединение с `vyatsu.ru` на порту `80`, отправляет HTTP-запрос и выводит часть ответа.
При проверке сервер вернул ответ `301 Moved Permanently`, потому что сайт перенаправляет запрос на HTTPS-версию.
Фильтр Wireshark:
```text
tcp.port==80
```
## HTTP через requests
```powershell
python http_requests_client.py
```
`requests` сам формирует HTTP-запрос, обрабатывает ответ и предоставляет удобный объект `response`.
При проверке `requests` автоматически обработал перенаправление и получил итоговый статус `200`.
## Gitea API
Токен нельзя хранить в коде. Нужно создать файл `.env`:
```text
GITEA_TOKEN=ваш_токен
```
Файл `.env` добавлен в `.gitignore`, поэтому он не должен попасть в коммит.
Запуск:
```powershell
python gitea_api.py
```
Программа выполняет запрос к:
```text
https://git.vyatsu.ru/api/v1/user
```
Для создания репозитория через API используется файл:
```powershell
python create_gitea_repo.py
```
Скрипт создает публичный репозиторий `API_REPO`.
## Выводы
TCP устанавливает соединение перед передачей данных. В Wireshark можно увидеть трехстороннее рукопожатие: `SYN`, `SYN-ACK`, `ACK`. При завершении соединения видны пакеты `FIN` и `ACK`.
UDP не устанавливает соединение перед отправкой данных. В Wireshark видны отдельные UDP-пакеты без handshake и без подтверждений доставки.
При работе через `socket` HTTP-запрос нужно составлять вручную. В примере через `socket` виден ответ `301 Moved Permanently`. Библиотека `requests` делает больше действий автоматически: формирует заголовки, обрабатывает ответ и переходит по перенаправлению, поэтому итоговый ответ получился со статусом `200`.
Через API Gitea был выполнен запрос к данным пользователя и создан репозиторий `API_REPO`. Для этого использовался токен, который хранится в `.env` и не попадает в коммиты.