141 lines
4.4 KiB
Markdown
141 lines
4.4 KiB
Markdown
# Лабораторная работа 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` и не попадает в коммиты.
|