Python bindings for RakNet, the UDP networking library used by Minecraft Bedrock. It ships a faithful binding of RakNet's public API and a pythonic layer on top of it, with both a synchronous and an asyncio interface.
importraknetwithraknet.create_connection(("play.example.com", 19132), timeout=5) asconn:
conn.send(b"\xfe...") # a Bedrock game packetprint(conn.recv(timeout=5))pip install raknetRequires Python 3.12 or newer. Prebuilt abi3 wheels are published for Windows and Linux
(x86-64); a single wheel works across all supported Python versions.
| Module | Interface | Use it for |
|---|---|---|
raknet | synchronous | blocking servers and clients, threads |
raknet.asyncio | asyncio | event-loop applications; mirrors the sync API with await |
raknet.raw | faithful C++ binding | direct access to RakPeerInterface and every RakNet type |
The two high-level layers share one connection model: a Peer accepts and initiates
connections, and each Connection is a message pipe with send / recv. Anything the
high-level layer does not cover is reachable through peer.raw.
importraknetdefhandle(connection):
formessageinconnection: # iterates until the peer disconnectsconnection.send(message) # echo it backwithraknet.create_server(("0.0.0.0", 19132), max_connections=32) asserver:
server.serve_forever(handle) # one thread per connectionimportraknetwithraknet.create_connection(("127.0.0.1", 19132), timeout=5) asconn:
conn.send(b"\xfehello")
reply=conn.recv(timeout=5)The asyncio layer is the same API with await in front; per-call timeouts are left to
asyncio.timeout().
importasyncioimportraknet.asyncioasyncdefhandle(connection):
asyncformessageinconnection:
awaitconnection.send(message)
asyncdefmain():
server=awaitraknet.asyncio.create_server(("0.0.0.0", 19132))
asyncwithserver:
awaitserver.serve_forever(handle)
asyncio.run(main())pong=raknet.ping(("play.example.com", 19132), timeout=5)
print(pong.round_trip_time, pong.data)More runnable programs are in examples/.
send and recv move bytes verbatim; there is no added framing. RakNet reads the first byte
of every packet as a message id and only delivers packets whose id is a user id
(>= 0x86, ID_USER_PACKET_ENUM). Lower ids are consumed as RakNet's own control traffic, so
each payload must begin with a user id. Minecraft Bedrock uses 0xFE. Reliability, priority
and the ordering channel are per-call:
conn.send(data, reliability=raknet.PacketReliability.RELIABLE_ORDERED,
priority=raknet.PacketPriority.HIGH_PRIORITY, channel=0)Failures raise exceptions rather than returning sentinels. All inherit from RakNetError, and
the connection-lifecycle ones also inherit from the builtin ConnectionError.
| Exception | Raised when |
|---|---|
StartupError | the peer could not bind its socket |
ConnectError | a connection attempt was rejected (.reason carries the cause) |
ConnectionClosedOK | the remote disconnected gracefully |
ConnectionClosedError | the connection was lost without notice |
TimeoutError | a timeout= elapsed (the builtin) |
Building needs a C++17 compiler and Conan. The raknet recipe is hosted on
the endstone remote:
conan remote add endstone https://conan.cloudsmith.io/endstone/conan/
pip install .The conan-py-build backend drives Conan and CMake,
so no separate conan install step is required.
pip install -e .
pytestBSD-3-Clause. See LICENSE.
RakNet is © Oculus VR and released under a BSD-style license.