pythonのsocket.ioクライアントライブラリ[閉じた
-
16-10-2019 - |
質問
Python用のsocket.ioクライアントライブラリをお勧めできますか?私は見回していましたが、私が見つけることができるのはサーバーの実装か、Twistedなどのフレームワークに依存することだけです。
他のフレームワークに依存しないクライアントライブラリが必要です。
Pythonクライアントは複数のSocketioサーバーで作業する必要があるため、多くの接続タイプのいずれかを使用するだけでは十分ではありません。その多くは、たとえばWebSocketsをサポートしていません。
解決
Archie1986の答えは良かったが、Socketioの更新で時代遅れになっている(より具体的には、そのプロトコル: https://github.com/learnboost/socket.io-pec)...私が知る限り、トランスポート(Websockets)接続を要求する前に手動で握手を実行する必要があります...以下のコードは不完全で不安であることに注意してください...握手の応答で返されたサポートされているトランスポートのリストを無視し、常にWebSocketを取得しようとします...また、握手が常に成功すると仮定します...それでも、開始するのに適した場所です
import websocket, httplib
...
'''
connect to the socketio server
1. perform the HTTP handshake
2. open a websocket connection '''
def connect(self) :
conn = httplib.HTTPConnection('localhost:8124')
conn.request('POST','/socket.io/1/')
resp = conn.getresponse()
hskey = resp.read().split(':')[0]
self._ws = websocket.WebSocket(
'ws://localhost:8124/socket.io/1/websocket/'+hskey,
onopen = self._onopen,
onmessage = self._onmessage)
....
また、Python-Websocketsで読みたいと思うかもしれません。 https://github.com/mtah/python-websocket
他のヒント
まず第一に、Socket.ioサーバーの一部がWebSocketをサポートしない理由はわかりません... socket.ioの意図は、抽象化されたインターフェイスをRealに提供することにより、Webアプリのフロントエンドブラウザ開発を簡単にすることです。 -Socket.ioサーバーによって提供されるタイムデータストリーム。おそらくsocket.ioは、アプリケーションに使用すべきことではありませんか?それはさておき、私はあなたの質問に答えようとしましょう...
この時点で、pythonのsocket.ioクライアントライブラリはありません(Gevent-socketioはsocket.ioではありません。 クライアント Pythonのライブラリ...それはsocket.ioです サーバ Python用ライブラリ)。今のところ、さまざまな接続タイプを受け入れながら、クライアントとしてSocket.ioと直接インターフェイスするために、元のコードを一緒につなぐ必要があります。
私はあなたがさまざまな接続タイプ(WebSocket、Longpollingなど)にわたって機能する治療法を探していることを知っていますが、このようなライブラリはまだ存在していないため、少なくともいくつかのガイダンスを与えることができます私の経験に基づいて、WebSocket接続タイプを使用します。
WebSocket接続タイプの場合、PythonでWebSocketクライアントを作成します。コマンドラインからこのPython WebSocketクライアントパッケージをインストールする ここ PIPを使用して、Python Pathのように次のようになります。
pip install -e git+https://github.com/liris/websocket-client.git#egg=websocket
あなたがそれをしたら、次のことを試してみてください SOCKET_IO_HOST
と SOCKET_IO_PORT
socket.ioサーバーの適切な場所を使用してください。
import websocket
SOCKET_IO_HOST = "127.0.0.1"
SOCKET_IO_PORT = 8080
socket_io_url = 'ws://' + SOCKET_IO_HOST + ':' + str(SOCKET_IO_PORT) + '/socket.io/websocket'
ws = websocket.create_connection(socket_io_url)
この時点で、Pythonから直接Socket.ioサーバーとインターフェースする媒体があります。 socket.ioサーバーにメッセージを送信するには、このWebSocket接続を介してメッセージを送信するだけです。 socket.ioサーバーがpython socket.ioクライアントからこのWebSocketを介して着信メッセージを適切に解釈するには、socket.ioプロトコルを遵守し、WebSocket接続を介して送信する文字列または辞書をエンコードする必要があります。たとえば、上記のすべてを達成した後、次のことを行います。
def encode_for_socketio(message):
"""
Encode 'message' string or dictionary to be able
to be transported via a Python WebSocket client to
a Socket.IO server (which is capable of receiving
WebSocket communications). This method taken from
gevent-socketio.
"""
MSG_FRAME = "~m~"
HEARTBEAT_FRAME = "~h~"
JSON_FRAME = "~j~"
if isinstance(message, basestring):
encoded_msg = message
elif isinstance(message, (object, dict)):
return encode_for_socketio(JSON_FRAME + json.dumps(message))
else:
raise ValueError("Can't encode message.")
return MSG_FRAME + str(len(encoded_msg)) + MSG_FRAME + encoded_msg
msg = "Hello, world!"
msg = encode_for_socketio(msg)
ws.send(msg)
Socketio-client ライブラリサポートイベントコールバックとチャンネルは、貢献者の仕事のおかげで利用可能です ピピ MITライセンスの下。
コールバックでエミットします。
from socketIO_client import SocketIO
def on_bbb_response(*args):
print 'on_bbb_response', args
with SocketIO('localhost', 8000) as socketIO:
socketIO.emit('bbb', {'xxx': 'yyy'}, on_bbb_response)
socketIO.wait_for_callbacks(seconds=1)
イベントを定義します。
from socketIO_client import SocketIO
def on_aaa_response(*args):
print 'on_aaa_response', args
socketIO = SocketIO('localhost', 8000)
socketIO.on('aaa_response', on_aaa_response)
socketIO.emit('aaa')
socketIO.wait(seconds=1)
名前空間でイベントを定義します。
from socketIO_client import SocketIO, BaseNamespace
class Namespace(BaseNamespace):
def on_aaa_response(self, *args):
print 'on_aaa_response', args
self.emit('bbb')
socketIO = SocketIO('localhost', 8000)
socketIO.define(Namespace)
socketIO.emit('aaa')
socketIO.wait(seconds=1)
単一のソケットで異なる名前空間を定義します。
from socketIO_client import SocketIO, BaseNamespace
class ChatNamespace(BaseNamespace):
def on_aaa_response(self, *args):
print 'on_aaa_response', args
class NewsNamespace(BaseNamespace):
def on_aaa_response(self, *args):
print 'on_aaa_response', args
socketIO = SocketIO('localhost', 8000)
chatNamespace = socketIO.define(ChatNamespace, '/chat')
newsNamespace = socketIO.define(NewsNamespace, '/news')
chatNamespace.emit('aaa')
newsNamespace.emit('aaa')
socketIO.wait(seconds=1)
sockettornad.io 人気のない非同期のライブラリ Tornado Webサーバー また、Pythonが利用できるオプションの1つでもあります。
書いた: https://github.com/amitu/amitu-websocket-client/blob/master/amitu/socketio_client.py. 。 WebSocketsのみをサポートするため、わずかなユーティリティしか持っていない可能性があります。
見ましたか Gevent-Socketio?
それが役に立てば幸い。