PyURT – Python Universal Retransmission Transport
PyURT — это надёжный асинхронный протокол поверх TCP с поддержкой фрейминга, контроля целостности (CRC32), сжатия (Zstandard), шифрования (AES-GCM), сериализации (msgpack / JSON) и автоматической ретрансмиссии при сбоях. Поддерживает передачу структурированных сообщений и файлов с разбивкой на чанки.
Версия 3.1.0 включает как асинхронный (asyncio), так и синхронный (блокирующие сокеты) API — выбирайте тот, который удобнее для вашего проекта.
Особенности
- Фрейминг – длина сообщения + CRC32.
- Сжатие – Zstandard (высокая скорость и степень сжатия).
- Шифрование – AES-GCM (аутентифицированное шифрование).
- Сериализация – msgpack с автоматическим fallback на JSON.
- Ретрансмиссия – клиент повторяет отправку при NACK или таймауте (до 3 попыток, с экспоненциальной задержкой).
- Файловая передача – разбивка на чанки, контрольная сумма SHA256, подтверждение каждого чанка.
- Асинхронность – высокопроизводительный сервер на
asyncio. - Синхронный режим – блокирующие сокеты для простых скриптов.
- CLI – готовые команды для сервера и клиента.
- Кроссплатформенность – работает на Windows, Linux, macOS.
Установка
pip install pyurt
## Использование в коде
### Асинхронный сервер
```python
import asyncio
from pyurt import PyURTServer
async def main():
server = PyURTServer()
# Сервер запустится на хосте и порте из ENV или можно изменить в коде:
# from pyurt import ENV
# ENV["HOST"] = "0.0.0.0"
# ENV["PORT"] = 9999
await server.run()
if __name__ == "__main__":
asyncio.run(main())
### Асинхронный клиент
```python
import asyncio
from pyurt import PyURTClient
async def main():
client = PyURTClient(host="127.0.0.1", port=8888)
await client.connect()
# Отправка простого сообщения
response = await client.send_message({"cmd": "ping", "id": 1})
print("Ответ:", response)
# Отправка файла
success = await client.send_file("/path/to/photo.jpg")
if success:
print("Файл отправлен успешно")
else:
print("Ошибка при отправке файла")
await client.close()
asyncio.run(main())
### Синхронный клиент
```python
from pyurt import PyURTClient
client = PyURTClient(host="127.0.0.1", port=8888)
# Отправка сообщения (блокирующий вызов)
response = client.send_message_sync({"cmd": "status"})
if response is not None:
print("Ответ:", response)
else:
print("Ошибка доставки")
# Отправка файла синхронно
success = client.send_file_sync("/path/to/document.pdf")
if success:
print("Файл отправлен")
else:
print("Ошибка")
## Обработка ошибок
Все методы клиента возвращают None при ошибке (или False для файлов). Вы можете обработать это:
```python
response = await client.send_message({"key": "value"})
if response is None:
print("Сообщение не доставлено (NACK, таймаут или ошибка)")
else:
print("Ответ:", response)
Для файлов:
```python
if not await client.send_file("data.bin"):
print("Ошибка отправки файла")
## Использование с контекстным менеджером (асинхронный)
```python
async with PyURTClient() as client:
response = await client.send_message({"hello": "world"})
print(response)
Отправка произвольных объектов
Вы можете отправлять любые сериализуемые объекты: списки, словари, числа, строки.
```python
await client.send_message([1, 2, 3, "a", "b"])
await client.send_message(42)
await client.send_message("Просто строка")
Автоматическая сериализация через msgpack (с fallback на JSON) обработает всё.
## Получение ответа от сервера
Сервер по умолчанию отвечает объектом:
```json
{
"echo": <ваше сообщение>,
"timestamp": 1234567890.123,
"server": "PyURT/3.1"
}
Вы можете использовать ответ по своему усмотрению.
## Пример обработки файлов на сервере
Сервер автоматически сохраняет принятые файлы в каталог PYURT_RECV_DIR (по умолчанию received_files). Вы можете переопределить каталог переменной окружения.
Если файл с таким именем уже существует, к нему добавляется суффикс с file_id, чтобы избежать перезаписи.
Смена ключа шифрования (безопасность)
Для реального использования обязательно задайте свой ключ (32 байта) через переменную окружения PYURT_KEY или в коде:
```python
from pyurt import ENV, SHARED_KEY
ENV["KEY"] = "my-32-byte-key-here-1234567890123"
# или измените SHARED_KEY напрямую (не рекомендуется)
Убедитесь, что ключ одинаков на сервере и клиенте.
```bash
pyurt-client --text "Привет, мир!"
Отправить JSON:
pyurt-client --text '{"action":"status","id":42}'
Отправить файл:
pyurt-client --file /path/to/document.pdf
Клиент (синхронный) – без asyncio
pyurt-client-sync --text "Hello, sync!"
pyurt-client-sync --file document.pdf
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyurt-3.1.1.tar.gz.
File metadata
- Download URL: pyurt-3.1.1.tar.gz
- Upload date:
- Size: 10.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b2c218f44c23d59e58fc1523073af165130cbbae0ac1a98e4321e4ee7d5bd18
|
|
| MD5 |
7463d06f56ef99af128b3eba77ed7c93
|
|
| BLAKE2b-256 |
6e26b900f7b3df56d54ebf8bc6bbd2f7f4173c5ef777a2032ee1c9fd4db5ec4e
|
File details
Details for the file pyurt-3.1.1-py3-none-any.whl.
File metadata
- Download URL: pyurt-3.1.1-py3-none-any.whl
- Upload date:
- Size: 11.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8b885c6cf24c54157358dc71873ccdb7262a06f4e77192d6fa2be567cb432945
|
|
| MD5 |
7aff2bcbe808a3e1752e6a5a28051d38
|
|
| BLAKE2b-256 |
8afa85cad842db25f9495b3d9dbfb839869540e17fefac67ccce361fa7acea18
|