Github: https://github.com/crossbario/autobahn-python
オートバン| Python
TwistedとasyncioのPython用WebSocket&WAMP
前書き
Autobahn | PythonはAutobahnのサブプロジェクトであり、オープンソースの実装を提供しています
Python 2と3ではTwistedとasyncioで動作します。
あなたはAutobahn | Pythonを使ってPythonでクライアントとサーバーを作成することができます。普通のWebSocketやWAMPを使っています。
WebSocket はWeb上やその他の場所で双方向のリアルタイムメッセージングを可能にし、 WAMPはWebSocketの上にリアルタイムのアプリケーション通信を追加します。
WAMPは、 WebSocketを介して実行される1つのプロトコルで、アプリケーションの非同期リモートプロシージャコールとPublish&Subscribeを提供します。 WAMPはルーティングされたプロトコルなので、 Autobahn | Pythonベースのクライアントに接続するにはWAMPルーターが必要です。 私たちはCrossbar.ioを提供していますが、 他にもオプションがあります 。
特徴
- WebSocketおよびWAMPクライアントおよびサーバー用のフレームワーク
- Python 2.7および3.3以降と互換性があります
- CPython 、 PyPy 、 Jythonで動く
- Twistedとasyncioの下で動作します – WebSocket RFC6455とDraft Hybi-10 +
- WebSocket圧縮を実装する
- WAMP 、Webアプリケーション・メッセージング・プロトコル
- 高性能で完全非同期の実装
- クラス最高の標準適合性( Autobahn Testsuite : Client Serverで 100%厳密なパス)
- WebSocket用のメッセージ、フレーム、およびストリーミングAPI
- TLS(セキュアWebSocket)とプロキシをサポートします。
- オープンソース( MITライセンス )
—
ネイティブ・ベクトル拡張(NVX)
Autobahnには、WebSocket(XORマスキング)とUTF-8検証のためのSIMD加速ネイティブベクターコードを提供するネットワークアクセラレータライブラリであるNVXが含まれています。
> NVXはネームスペースautobahn.nvxに存在し、現在は少なくともSSE2を搭載したx86-86 CPUが必要で、利用可能であればSSE4.1を使用します。 このコードは、ベクトルイントリンシックを使用して記述され、GCCとClangの両方でコンパイルし、CFFIを使用してPythonとインターフェイスするため、PyPy上で高速に実行されます。
—
いくつかのコードを表示する
あなたに最初の印象を与えるために、ここに2つの例があります。 レポにはもっと多くのものがあります。
WebSocketエコーサーバー
受信したWebSocketメッセージをエコーバックする単純なWebSocketエコーサーバを次に示します。
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))
実際に上記のサーバープロトコルを実行するには、いくつかの定型文が必要です。
WAMPアプリケーションコンポーネント
WAMPが提供する4種類のアクションをすべて実行するWAMPアプリケーションコンポーネントは次のとおりです。
- トピックを購読する
- イベントを公開する
- プロシージャを登録する
- 手続きを呼び出す
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))
上記のコードは、単一の行( MyComponent
基本クラス)を変更することにより、Twistedとasyncioで動作します。 上記のアプリケーションコンポーネントを実際に実行するには、いくつかの定型文とWAMPルーターが必要です。