Клиентская библиотека Socket.IO в Python
Может ли кто-нибудь рекомендовать библиотеку Socket.IO для Python?
Я посмотрел вокруг, но единственное, что я могу найти, это либо реализация сервера, либо зависимость от структуры, такой как Twisted.
Мне нужна клиентская библиотека, которая не имеет зависимости от других фреймворков.
Просто использовать один из многих типов соединений недостаточно, так как клиенту python нужно будет работать с несколькими серверами сокетов, многие из которых, например, не будут поддерживать веб-сайты.
Ответы
Ответ 1
Ответ Archie1986 был хорошим, но устарел с обновлениями socketio (точнее, его протокол: https://github.com/LearnBoost/socket.io-spec)... насколько это возможно я могу сказать, вам нужно выполнить рукопожатие вручную, прежде чем вы сможете запросить соединение с транспортом (например, 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
Ответ 2
Прежде всего, я не уверен, почему некоторые из ваших серверов Socket.IO не поддерживают веб-порты... Цель Socket.IO - облегчить разработку веб-приложений в браузере переднего плана, предоставив абстрагированный интерфейс для потоков данных реального времени, обслуживаемых сервером Socket.IO. Возможно, Socket.IO не то, что вы должны использовать для своего приложения? В стороне, позвольте мне попытаться ответить на ваш вопрос...
На данный момент нет никаких клиентских библиотек Socket.IO для Python (gevent-socketio не является клиентской библиотекой Socket.IO для Python... это серверная библиотека Socket.IO для Python). На данный момент вам нужно будет скомпоновать некоторый оригинальный код, чтобы напрямую взаимодействовать с Socket.IO как клиентом, принимая различные типы соединений.
Я знаю, что вы ищете лекарство - все, что работает по различным типам подключений (WebSocket, длительный опрос и т.д.), но поскольку такая библиотека еще не существует, я могу хотя бы дать вам некоторые рекомендации по использованию типа подключения WebSocket на основе моего опыта.
Для типа подключения WebSocket создайте клиент WebSocket на Python. Из командной строки установите этот пакет Python WebSocket Client здесь с помощью пипа, чтобы он был на вашем пути python следующим образом:
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)
На этом этапе у вас есть среда взаимодействия с сервером Socket.IO непосредственно с Python. Для отправки сообщений на сервер Socket.IO просто отправьте сообщение через это соединение WebSocket. Чтобы сервер Socket.IO правильно интерпретировал входящие сообщения через этот WebSocket с вашего клиента Python Socket.IO, вам необходимо придерживаться протокола 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)
Ответ 3
Библиотека socketIO-client поддерживает обратные вызовы и каналы событий благодаря работе вкладчиков и доступна на PyPI под лицензией 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)
Ответ 4
Библиотека SocketTornad.IO с популярным асинхронным Веб-сервер Tornado также является одним из вариантов, доступных для python.
Ответ 5
Написал один: https://github.com/amitu/amitu-websocket-client/blob/master/amitu/socketio_client.py. Он поддерживает только веб-узлы, поэтому для вас может быть только ограниченная утилита.
Ответ 6
Вы посмотрели gevent-socketio?
Надеюсь, что это поможет.