Skip to main content

PyURT – Python Universal Retransmission Transport

PyURT — это надёжный асинхронный протокол поверх TCP с поддержкой фрейминга, контроля целостности (CRC32), сжатия (Zstandard), шифрования (AES-GCM), сериализации (msgpack / JSON) и автоматической ретрансмиссии при сбоях. Поддерживает передачу структурированных сообщений и файлов с разбивкой на чанки.

Версия 3.1.3 включает как асинхронный (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

pyurt-3.1.3.tar.gz (10.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyurt-3.1.3-py3-none-any.whl (11.1 kB view details)

Uploaded Python 3

File details

Details for the file pyurt-3.1.3.tar.gz.

File metadata

  • Download URL: pyurt-3.1.3.tar.gz
  • Upload date:
  • Size: 10.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.14

File hashes

Hashes for pyurt-3.1.3.tar.gz
Algorithm Hash digest
SHA256 b3525afe3f2e81956ee9cb9077be5cc3d44a3c83d741f20bf39c4a4df3c5426c
MD5 6edc45be4204adfa2b58837fd028de06
BLAKE2b-256 12fa625216767f413957ee5cbf6096e1e18fe51e18503497c66b496bd8771948

See more details on using hashes here.

File details

Details for the file pyurt-3.1.3-py3-none-any.whl.

File metadata

  • Download URL: pyurt-3.1.3-py3-none-any.whl
  • Upload date:
  • Size: 11.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.14

File hashes

Hashes for pyurt-3.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 86a060894db7881b14b5a5e4519485011edc0394e56d60a5fc3b3087ad658a84
MD5 5b1b931042f5598729c44627a216572b
BLAKE2b-256 0346fe47d0e5c93f280ab68d53ae73059461f4040852033806217f5cd43acb62

See more details on using hashes here.

Release history Release notifications | RSS feed

3.1.4

2 files

This release

3.1.3 This release

2 files

3.1.2

2 files

3.1.1

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page