Skip to main content

Multiplayer library

Project description

PyReverb Banner

PyReverb

PyPI version License

PyReverb is a lightweight Python networking framework for real-time client–server synchronization of game and simulation objects.

It is designed to make it easy to:

  • Define network-aware objects once, and use them on both server and client
  • Keep object state synchronized across all peers
  • Trigger remote actions using events and RPC-like calls
  • Build fast multiplayer prototypes and real-time simulations

Table of Contents

  1. Features
  2. Why PyReverb
  3. Installation
  4. Quick Start
  5. Event System
  6. Project Structure
  7. Support
  8. Contributing
  9. License
  10. Author

Features

  • Object synchronization
    Define ReverbObject subclasses and keep their state in sync across the network.

  • Client–server framework
    Built-in Server and Client abstractions to manage connections and messaging.

  • Event-driven architecture
    Register callbacks on custom events (connect, disconnect, gameplay events, etc.).

  • Remote calls / actions
    Execute actions remotely between server and clients in a structured way.

  • Lightweight and focused
    Minimal external dependencies; integrates well with existing game loops (e.g. pygame).


Why PyReverb

  • Game-oriented: Designed with real-time games and interactive simulations in mind.
  • Simple mental model: Think in terms of objects and events, not raw sockets.
  • Python-first: Pure Python API that fits naturally into existing Python projects.
  • Extensible: You control how objects are created, synchronized, and updated.

Use it for:

  • 2D/3D multiplayer games
  • Real-time collaborative tools
  • Networked simulations and visualizations

Installation

Requirements:

  • Python 3.13+
  • virtualenv or another virtual environment tool (recommended)

Inside your virtual environment:

git clone https://github.com/LeLaboDuGame/PyReverb.git
cd PyReverb

# Install dependencies for development / local use
pip install -r requirements.txt

# Or install as a package (editable for development)
pip install -e .

You can also install directly from source in another project:

bash
pip install git+https://github.com/LeLaboDuGame/PyReverb.git

Quick Start

Below is a minimal end‑to‑end example showing:

  1. How to define a synchronized object
  2. How to start a server
  3. How to connect a client

The code is written as if you split it into three files: shared_objects.py, server.py, and client.py inside your project.

1. Define a networked object

# shared_objects.py
from pyreverb.reverb import ReverbManager, ReverbSide, ReverbObject

# Decide which side you're currently defining for.
# This file can be imported by both client and server.
ReverbManager.REVERB_SIDE = ReverbSide.SERVER  # or CLIENT when imported by the client


@ReverbManager.reverb_object_attribute
class Player(ReverbObject):
    def __init__(self, pos=(0, 0), uid=None, add_on_init=True):
        # Local attributes that will be synchronized
        self.pos = list(pos)
        super().__init__(uid=uid, add_on_init=add_on_init)

    def on_init_from_server(self):
        # Called when the Player is created on the server
        print(f"[SERVER] Player {self.uid} initialized at {self.pos}")

    def on_init_from_client(self):
        # Called when the Player appears on a client
        print(f"[CLIENT] Player {self.uid} spawned at {self.pos}")

2. Minimal server

# server.py
from pyreverb.reverb import ReverbManager, ReverbSide, Server
from shared_objects import Player  # noqa: F401 - ensure class is registered


def main():
    # Configure PyReverb as server-side
    ReverbManager.REVERB_SIDE = ReverbSide.SERVER

    server = Server()
    ReverbManager.REVERB_CONNECTION = server

    # Start listening for clients
    server.start_server()

    # Create a player instance on the server
    player = Player(pos=(5, 5))
    print(f"[SERVER] Created Player with uid={player.uid}")

    # Main loop placeholder (replace with your game loop)
    try:
        while True:
            # Process network events / messages
            server.update()
            # ... your game logic, physics, etc. ...
    except KeyboardInterrupt:
        print("[SERVER] Shutting down...")
        server.stop_server()


if __name__ == "__main__":
    main()

3. Minimal client

# client.py
from pyreverb.reverb import ReverbManager, ReverbSide, Client
from shared_objects import Player  # noqa: F401 - ensure class is registered


def main():
    # Configure PyReverb as client-side
    ReverbManager.REVERB_SIDE = ReverbSide.CLIENT

    client = Client()
    ReverbManager.REVERB_CONNECTION = client

    # Connect to the server (adjust host/port if needed)
    client.connect(host="127.0.0.1", port=5555)

    # Main loop placeholder (replace with your render / game loop)
    try:
        while True:
            client.update()
            # Here you would update local input and send changes, e.g.:
            # for player in Player.get_all_instances():
            #     player.pos[0] += 1  # move right, for example
    except KeyboardInterrupt:
        print("[CLIENT] Disconnecting...")
        client.disconnect()


if __name__ == "__main__":
    main()

How this works:

  • The Player class is registered as a networked object via @ReverbManager.reverb_object_attribute.
  • The server creates a Player instance; PyReverb synchronizes it with connected clients.
  • The client keeps a local mirror of the Player instance and can react to updates in its callbacks.

For more advanced usage (multiple object types, more complex logic, etc.), you can follow the same pattern with additional ReverbObject subclasses.


Event System

PyReverb uses an event-driven core so that you can react to network events without constantly polling everything manually.

A simplified usage pattern looks like this:

from pyreverb.reverb import ReverbManager

kernel = ReverbManager.get_kernel()

@kernel.on_event("client_connected")
def on_client_connected(client_id):
    print(f"Client connected: {client_id}")

@kernel.on_event("client_disconnected")
def on_client_disconnected(client_id):
    print(f"Client disconnected: {client_id}")

You can define and emit custom events to coordinate gameplay logic, lobby systems, or other high‑level behaviors above the raw networking layer.


Project Structure

At a high level, the repository is organized as follows:

  • src/pyreverb/ – Core library code
  • src/pyreverb/assets/ – Assets such as the README banner
  • src/pyreverb/Exemple/ – Example project demonstrating PyReverb in action
  • pyproject.toml – Packaging configuration
  • README.md – Project documentation (this file)

You can use the example project as a reference when integrating PyReverb into your own game or simulation.


Support

  • Open an Issue on the repository for bugs or feature requests.
  • Use Discussions (if enabled) for general questions and design ideas.
  • Check the source and examples for reference implementations.

Contributing

Contributions are welcome.

  1. Open an issue to discuss new features or changes.
  2. Fork the repository and create a feature branch:
    git checkout -b feature/my-feature
    
  3. Implement your changes and add tests or example usage where appropriate.
  4. Ensure code style and formatting are consistent.
  5. Open a Pull Request with a clear description of what you changed and why.

License

This project is licensed under the Apache License 2.0.
See the LICENSE file for the full license text.


Author

PyReverb is maintained by LeLaboDuGame (Twitch: https://twitch.tv/LaboTTV).
For more information and updates, see the project homepage:

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

pyreverb-1.8.0.tar.gz (24.7 kB view details)

Uploaded Source

Built Distribution

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

pyreverb-1.8.0-py3-none-any.whl (23.8 kB view details)

Uploaded Python 3

File details

Details for the file pyreverb-1.8.0.tar.gz.

File metadata

  • Download URL: pyreverb-1.8.0.tar.gz
  • Upload date:
  • Size: 24.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for pyreverb-1.8.0.tar.gz
Algorithm Hash digest
SHA256 a74821d724d0d3b8a3d24ed72a8def3bde5c14dd7598dce5aececec4a2b0a789
MD5 dc1075fa872ba7e92af4b291f10827cf
BLAKE2b-256 b638717eb90faa91508b58e08b07ae61173a02932c72e34e530999e42730b1e2

See more details on using hashes here.

File details

Details for the file pyreverb-1.8.0-py3-none-any.whl.

File metadata

  • Download URL: pyreverb-1.8.0-py3-none-any.whl
  • Upload date:
  • Size: 23.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for pyreverb-1.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 24ad2bb057899196e9311a235b9e5dff66ee85d0700b0bfba462e6514cfa551a
MD5 66a08e7276ff501b395ed2d98e430b07
BLAKE2b-256 85cd9bafeda398cc990b083a246eaa8e1772044a551d3fec8c966b2ddeb3bbef

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