ZMQ-based server for the LAPLACE-LHC project
Project description
LAPLACE Server (LAPLACE-LHC)
ZMQ-based server for the LAPLACE-LHC project.
This package provides a lightweight, command-driven server running in its own thread, designed to exchange structured messages with clients using a defined protocol. It is independent from GUI frameworks, while still allowing seamless integration with PyQt through callback-based controllers.
Features
- ZMQ-based TCP server
- Runs in its own non-daemon thread
- Protocol-based message validation and dispatching
- Configurable command callbacks
- Optional PyQt6 signal integration (without QObject inheritance)
- Clear separation between protocol, validation, and handlers
Installation
From PyPI:
pip install laplace-server
Or from source (editable mode):
git clone https://github.com/SemionTche/laplace_server.git
cd laplace_server
pip install -e .
Basic Usage
Start a server
from laplace_server.server_lhc import ServerLHC
from laplace_server.protocol import DEVICE_MOTOR
server = ServerLHC(
name="my_server",
address="tcp://*:5555",
freedom=2,
device=DEVICE_MOTOR
)
server.start()
Update server data
server.set_data({"x": 1.2, "y": 3.4})
The stored data is transmitted when a CMD_GET request is received.
Stop the server
server.stop()
⚠️ The server runs in its own non-daemon thread and must be explicitly stopped to allow the Python process to exit cleanly.
Protocol Overview
The server communicates using a lightweight, JSON-based message protocol over ZMQ. Each message must follow a well-defined structure and include a protocol version to ensure compatibility between clients and servers.
Message Structure
All messages exchanged with the server must be JSON objects with the following fields:
version— Protocol version identifiercmd— Command namefrom— Sender identifierpayload— Command-specific data (may be empty)
Example message:
{
"version": "0.1.6",
"cmd": "GET",
"from": "client_1",
"payload": {}
}
Messages that do not comply with this structure are rejected and may trigger an error response from the server.
Commands
The protocol defines a fixed set of commands used to interact with the server, including:
CMD_INFO— Request server informationCMD_PING— Check server availabilityCMD_GET— Retrieve the server dataCMD_SET— For motor realted server, set new positionsCMD_SAVE— Indicate a saving pathCMD_OPT— Send optimization-related dataCMD_STOP— Request server shutdown
Each command is handled by a dedicated handler function on the server side.
Protocol Versioning
The protocol version is defined by laplace_server.protocol.PROTOCOL_VERSION and is
validated for every incoming message. If a version mismatch is detected, the message
is rejected to prevent undefined behavior.
The protocol version is independent from the package release version
(__version__) and is only updated when the message format or semantics change.
PyQt6 Integration
The server does not inherit from QObject.
Instead, callbacks can be connected to a ServerController, which emits PyQt6
signals.
from laplace_server.server_lhc import ServerLHC
from laplace_server.server_controller import ServerController
server = ServerLHC(...)
controller = ServerController()
server.set_on_get(controller.on_get)
server.set_on_opt(controller.on_opt)
This design keeps the server independent from PyQt while remaining GUI-friendly.
Project Structure
laplace_server/
├── server_lhc.py # Main server implementation
├── server_controller.py # PyQt6 signal controller (optional)
├── protocol.py # Protocol constants and helpers
├── validations.py # Input and message validation utilities
├── handlers/ # Command handlers
└── __init__.py
Versioning
-
laplace_server.__version__Package release version (matches the PyPI version). -
laplace_server..protocol.PROTOCOL_VERSIONInternal communication protocol version, used to validate messages and ensure compatibility between clients and servers.
These two versions are intentionally independent.
Error Handling Philosophy
- Validation functions return human-readable error messages or
None - Errors are logged, not raised, for expected runtime issues
- The server decides how to react (reply with error, ignore, continue)
This approach is suited for long-running network services.
License
GPL-3.0
Status
This project is actively used within the LAPLACE-LHC ecosystem and is intended for controlled environments rather than general-purpose networking.
Project details
Release history Release notifications | RSS feed
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 laplace_server-0.1.9.tar.gz.
File metadata
- Download URL: laplace_server-0.1.9.tar.gz
- Upload date:
- Size: 25.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fe8b5eb2ad8033ac3c6a14d5f0cf536e485b2badec7338c744dc30d4275bdf6c
|
|
| MD5 |
1369b7804c6c4638304d723d04b1610f
|
|
| BLAKE2b-256 |
647e8d4b56c5db80a97d0fda4ee88fe987608a3f9ac68ac48b4aa324a011c1f0
|
File details
Details for the file laplace_server-0.1.9-py3-none-any.whl.
File metadata
- Download URL: laplace_server-0.1.9-py3-none-any.whl
- Upload date:
- Size: 28.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c8d06ebc474f9a1789cc124c959a410aaaee06e8b6c601eb16b5fbf253306a1e
|
|
| MD5 |
7f0bd8db40c92815e4f5efa6fbf9ddf7
|
|
| BLAKE2b-256 |
644cc9ad9bbe403be42253336bdfde5364057cf44fa2405bd7dfb422547c4dac
|