Skip to content

raknet

PyPIPythonLicense

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))

Installation

pip install raknet

Requires 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.

The three layers

ModuleInterfaceUse it for
raknetsynchronousblocking servers and clients, threads
raknet.asyncioasyncioevent-loop applications; mirrors the sync API with await
raknet.rawfaithful C++ bindingdirect 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.

Quick start

Server

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 connection

Client

importraknetwithraknet.create_connection(("127.0.0.1", 19132), timeout=5) asconn:
conn.send(b"\xfehello")
reply=conn.recv(timeout=5)

asyncio

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())

Server-list ping

pong=raknet.ping(("play.example.com", 19132), timeout=5)
print(pong.round_trip_time, pong.data)

More runnable programs are in examples/.

Messages

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)

Errors

Failures raise exceptions rather than returning sentinels. All inherit from RakNetError, and the connection-lifecycle ones also inherit from the builtin ConnectionError.

ExceptionRaised when
StartupErrorthe peer could not bind its socket
ConnectErrora connection attempt was rejected (.reason carries the cause)
ConnectionClosedOKthe remote disconnected gracefully
ConnectionClosedErrorthe connection was lost without notice
TimeoutErrora timeout= elapsed (the builtin)

Building from source

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.

Development

pip install -e .
pytest

License

BSD-3-Clause. See LICENSE.

RakNet is © Oculus VR and released under a BSD-style license.

About

Python bindings for the RakNet networking library with synchronous and asyncio APIs

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

71 stars

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages