Autobahn\|Python ================ WebSocket & WAMP for Python on Twisted and asyncio. | |Version| |Build Status| |Coverage| |Docs| |Docker| -------------- | **Quick Links**: `Source Code `__ - `Documentation `__ - `WebSocket Examples `__ - `WAMP Examples `__ | **Community**: `Mailing list `__ - `StackOverflow `__ - `Twitter `__ - `IRC #autobahn/chat.freenode.net `__ | **Companion Projects**: `Autobahn|JS `__ - `Autobahn|Cpp `__ - `Autobahn|Testsuite `__ - `Crossbar.io `__ - `WAMP `__ Introduction ------------ **Autobahn\|Python** is a subproject of `Autobahn `__ and provides open-source implementations of - `The WebSocket Protocol `__ - `The Web Application Messaging Protocol (WAMP) `__ for Python 2 and 3, and running on `Twisted `__ and `asyncio `__. You can use **Autobahn\|Python** to create clients and servers in Python speaking just plain WebSocket or WAMP. **WebSocket** allows `bidirectional real-time messaging on the Web `__ and beyond, while `WAMP `__ adds real-time application communication on top of WebSocket. **WAMP** provides asynchronous **Remote Procedure Calls** and **Publish & Subscribe** for applications in *one* protocol running over `WebSocket `__. WAMP is a *routed* protocol, so you need a **WAMP Router** to connect your **Autobahn\|Python** based clients. We provide `Crossbar.io `__, but there are `other options `__ as well. Features -------- - framework for `WebSocket `__ and `WAMP `__ clients and servers - compatible with Python 2.7 and 3.3 or later - runs on `CPython `__, `PyPy `__ and `Jython `__ - runs under `Twisted `__ and `asyncio `__ - implements WebSocket `RFC6455 `__ and Draft Hybi-10+ - implements `WebSocket compression `__ - implements `WAMP `__, the Web Application Messaging Protocol - high-performance, fully asynchronous implementation - best-in-class standards conformance (100% strict passes with `Autobahn Testsuite `__: `Client `__ `Server `__) - message-, frame- and streaming-APIs for WebSocket - supports TLS (secure WebSocket) and proxies - Open-source (`MIT license `__) Show me some code ----------------- To give you a first impression, here are two examples. We have lot more `in the repo `__. WebSocket Echo Server ~~~~~~~~~~~~~~~~~~~~~ Here is a simple WebSocket Echo Server that will echo back any WebSocket message received: .. code:: python from autobahn.twisted.websocket import WebSocketServerProtocol # or: from autobahn.asyncio.websocket import WebSocketServerProtocol class MyServerProtocol(WebSocketServerProtocol): def onConnect(self, request): print("Client connecting: {}".format(request.peer)) def onOpen(self): print("WebSocket connection open.") def onMessage(self, payload, isBinary): if isBinary: print("Binary message received: {} bytes".format(len(payload))) else: print("Text message received: {}".format(payload.decode('utf8'))) # echo back message verbatim self.sendMessage(payload, isBinary) def onClose(self, wasClean, code, reason): print("WebSocket connection closed: {}".format(reason)) To actually run above server protocol, you need some lines of `boilerplate `__. WAMP Application Component ~~~~~~~~~~~~~~~~~~~~~~~~~~ Here is a WAMP Application Component that performs all four types of actions that WAMP provides: #. **subscribe** to a topic #. **publish** an event #. **register** a procedure #. **call** a procedure .. code:: python from autobahn.twisted.wamp import ApplicationSession # or: from autobahn.asyncio.wamp import ApplicationSession class MyComponent(ApplicationSession): @inlineCallbacks def onJoin(self, details): # 1. subscribe to a topic so we receive events def onevent(msg): print("Got event: {}".format(msg)) yield self.subscribe(onevent, 'com.myapp.hello') # 2. publish an event to a topic self.publish('com.myapp.hello', 'Hello, world!') # 3. register a procedure for remote calling def add2(x, y): return x + y self.register(add2, 'com.myapp.add2'); # 4. call a remote procedure res = yield self.call('com.myapp.add2', 2, 3) print("Got result: {}".format(res)) Above code will work on Twisted and asyncio by changing a single line (the base class of ``MyComponent``). To actually run above application component, you need some lines of `boilerplate `__ and a `WAMP Router `__. .. |Version| image:: https://img.shields.io/pypi/v/autobahn.svg :target: https://pypi.python.org/pypi/autobahn .. |Master Branch| image:: https://img.shields.io/badge/branch-master-orange.svg :target: https://travis-ci.org/crossbario/autobahn-python.svg?branch=master .. |Build Status| image:: https://travis-ci.org/crossbario/autobahn-python.svg?branch=master :target: https://travis-ci.org/crossbario/autobahn-python .. |Coverage| image:: https://img.shields.io/codecov/c/github/crossbario/autobahn-python/master.svg :target: https://codecov.io/github/crossbario/autobahn-python .. |Docs| image:: https://img.shields.io/badge/docs-latest-brightgreen.svg?style=flat :target: https://autobahn.readthedocs.io/en/latest/ .. |Docker| image:: https://img.shields.io/badge/docker-ready-blue.svg?style=flat :target: https://hub.docker.com/r/crossbario/autobahn-python/