Подтвердить что ты не робот

Клиентская библиотека Socket.IO в Python

Может ли кто-нибудь рекомендовать библиотеку Socket.IO для Python? Я посмотрел вокруг, но единственное, что я могу найти, это либо реализация сервера, либо зависимость от структуры, такой как Twisted.

Мне нужна клиентская библиотека, которая не имеет зависимости от других фреймворков.

Просто использовать один из многих типов соединений недостаточно, так как клиенту python нужно будет работать с несколькими серверами сокетов, многие из которых, например, не будут поддерживать веб-сайты.

4b9b3361

Ответ 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.

Ответ 6

Вы посмотрели gevent-socketio?

Надеюсь, что это поможет.