Cheat sheet#
Server#
Write a coroutine that handles a single connection. It receives a WebSocket protocol instance and the URI path in argument.
Call
recv()
andsend()
to receive and send messages at any time.When
recv()
orsend()
raisesConnectionClosed
, clean up and exit. If you started otherasyncio.Task
, terminate them before exiting.If you aren’t awaiting
recv()
, consider awaitingwait_closed()
to detect quickly when the connection is closed.You may
ping()
orpong()
if you wish but it isn’t needed in general.
Create a server with
serve()
which is similar to asyncio’screate_server()
. You can also use it as an asynchronous context manager.The server takes care of establishing connections, then lets the handler execute the application logic, and finally closes the connection after the handler exits normally or with an exception.
For advanced customization, you may subclass
WebSocketServerProtocol
and pass either this subclass or a factory function as thecreate_protocol
argument.
Client#
Create a client with
connect()
which is similar to asyncio’screate_connection()
. You can also use it as an asynchronous context manager.For advanced customization, you may subclass
WebSocketClientProtocol
and pass either this subclass or a factory function as thecreate_protocol
argument.
Call
recv()
andsend()
to receive and send messages at any time.You may
ping()
orpong()
if you wish but it isn’t needed in general.If you aren’t using
connect()
as a context manager, callclose()
to terminate the connection.
Debugging#
If you don’t understand what websockets is doing, enable logging:
import logging
logger = logging.getLogger('websockets')
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())
The logs contain:
Exceptions in the connection handler at the
ERROR
levelExceptions in the opening or closing handshake at the
INFO
levelAll frames at the
DEBUG
level — this can be very verbose
If you’re new to asyncio
, you will certainly encounter issues that are
related to asynchronous programming in general rather than to websockets in
particular. Fortunately Python’s official documentation provides advice to
develop with asyncio. Check it out: it’s invaluable!