Skip to main content

A lightweight binary protocol implementation

Project description

Custom Binary Protocol API

Requirements

  • Python 3.8 or higher
  • asyncio
  • pytest
  • matplotlib & seaborn
  • psutil

Overview

This project implements a lightweight, configurable binary protocol for client-server communication in Python. Unlike traditional REST APIs, this implementation uses a custom binary protocol for data transfer, resulting in lower latency and reduced network overhead.

Key Features

  • Structured Message Format: Define message structures with typed fields
  • Efficient Data Transfer: Custom binary protocol minimizes overhead compared to HTTP/REST
  • Type-safe Field Handling: Automatic serialization of primitive types
  • Asynchronous Communication: Built on asyncio for high-performance I/O operations
  • Zero Dependencies: Pure Python implementation with no external requirements
  • Bi-directional Communication: Supports full-duplex communication between client and server
  • Fixed and Variable Length Fields: Support for both fixed and variable-length data
  • Optimized Performance: Fast-path for fixed-length messages

Quick Examples

Message Type Definition

from enum import IntEnum
from binary_protocol.protocol.message_structure import FieldDefinition, MessageStructure

# Define message types
class MessageType(IntEnum):
    SENSOR_DATA = 1
    STATUS = 2
    BENCHMARK = 3
    FIXED_BENCHMARK = 4

# Define fixed-length structure for high-speed sensor data
sensor_data_structure = MessageStructure([
    FieldDefinition("sensor1", float, format_string=">f"),  # 4-byte float
    FieldDefinition("sensor2", float, format_string=">f"),
    FieldDefinition("sensor3", float, format_string=">f"),
    FieldDefinition("sensor4", float, format_string=">f")
])

# Variable-length structure example
status_structure = MessageStructure([
    FieldDefinition("status_code", int, format_string=">I"),
    FieldDefinition("message", str)  # Variable length
])

# Fixed-length benchmark structure
fixed_benchmark_structure = MessageStructure([
    FieldDefinition("value", int, format_string=">I")  # 4-byte integer
])

Protocol Configuration

from binary_protocol import ProtocolConfig

config = ProtocolConfig(
    message_type_enum=MessageType,
    message_structures={
        MessageType.SENSOR_DATA: sensor_data_structure,
        MessageType.STATUS: status_structure,
        MessageType.BENCHMARK: benchmark_structure,
        MessageType.FIXED_BENCHMARK: fixed_benchmark_structure
    },
    header_format=">H",  # 2-byte header for message type
    max_payload_size=10 * 1024 * 1024  # 10MB
)

Benchmarking Features

Available Benchmark Types

  1. Fixed Size Benchmark

    • Optimized for consistent message sizes
    • Validates message integrity
    • Uses predefined message templates
  2. Variable Size Benchmark

    • Tests multiple message sizes
    • Measures scaling characteristics
    • Configurable size ranges
  3. Realistic Benchmark

    • Multi-client simulation
    • Random message sizes
    • Configurable client behavior

Running Benchmarks

python examples/basic_client.py --benchmark [options]

Options:

  • --all: Run all benchmark types
  • --fixed: Run fixed-size benchmarks
  • --variable: Run variable-size benchmarks
  • --realistic: Run realistic benchmarks

Output Formats

Console Output

  • Detailed benchmark summary tables
  • Resource utilization metrics
  • Statistical analysis
  • Performance comparisons

Generated Files

  • JSON result files
  • Performance plots (PNG)
  • Comparison reports
  • Resource usage graphs

Protocol Configuration Options

Option Description Default
message_type_enum Enum class for message types Required
message_structures Dict of structures per type Required
header_format Struct format for message header ">H"
max_payload_size Maximum allowed payload size 1MB
connect_timeout Connection timeout in seconds 30.0
read_timeout Read operation timeout 30.0

Field Types and Performance

Field Type Format Performance Impact Batch Support
int/float (fixed) ">f", ">i", etc. Fastest Up to 100k msgs/batch
fixed-length str/bytes fixed_length=N Fast Up to 50k msgs/batch
variable-length str/bytes None Additional overhead Dynamic batch size

Security Considerations

  1. Encryption: Consider adding TLS for secure communication
  2. Authentication: Implement a secure authentication mechanism
  3. Input Validation: Validate field contents
  4. Rate Limiting: Protect against DoS attacks
  5. Message Size Limits: Configure appropriate max_payload_size

Performance Optimizations

When enable_performance_improvements is True (default):

  • Uses message pooling to reduce GC pressure
  • Implements zero-copy operations where possible
  • Optimizes fixed-length message handling
  • Reduces memory allocations

Example configuration with performance improvements:

config = ProtocolConfig(
    message_type_enum=MessageType,
    message_structures={
        MessageType.SENSOR_DATA: sensor_data_structure,
        MessageType.STATUS: status_structure
    },
    enable_performance_improvements=True  # Enable optimizations
)

License

This project is licensed under the MIT License. See the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

binary_protocol-0.2.2.tar.gz (24.5 kB view details)

Uploaded Source

Built Distribution

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

binary_protocol-0.2.2-py3-none-any.whl (28.8 kB view details)

Uploaded Python 3

File details

Details for the file binary_protocol-0.2.2.tar.gz.

File metadata

  • Download URL: binary_protocol-0.2.2.tar.gz
  • Upload date:
  • Size: 24.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for binary_protocol-0.2.2.tar.gz
Algorithm Hash digest
SHA256 af81b8893c1890683517683f6c0b45774c2d71949fe482bf6f6d8baa5a530ce0
MD5 c6a9f6cc33304b2251dce8dceb2977de
BLAKE2b-256 a77959e03fbce505412e78b1db869e69283366679a853e43e941ebc7640f3521

See more details on using hashes here.

File details

Details for the file binary_protocol-0.2.2-py3-none-any.whl.

File metadata

File hashes

Hashes for binary_protocol-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 6f23b9189f99926cb714f9af11269cb6a5745e3b4cb0ec2070ba3a8440bf2176
MD5 7c0705b5500c6d04c425e7093271e401
BLAKE2b-256 354ff234f3ff16bc456e1f6a1656b41730935e9f3cc336292f5e2d9c258d32ed

See more details on using hashes here.

Supported by

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