Клиентская библиотека Socket.IO в Python [закрыта]

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

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

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


person Ada    schedule 21.01.2011    source источник


Ответы (6)


Ответ Archie1986 был хорош, но устарел с обновлениями сокетио (в частности, его протоколом: https://github.com/LearnBoost/socket.io-spec)... насколько я могу судить, вам нужно выполнить рукопожатие вручную, прежде чем вы сможете запросить транспортное соединение (например, веб-сокеты)... обратите внимание приведенный ниже код является неполным и небезопасным... во-первых, он игнорирует список поддерживаемых транспортов, возвращенных в ответе на рукопожатие, и всегда пытается получить веб-сокет... также предполагается, что рукопожатие всегда завершается успешно... тем не менее, это хорошее место для начала

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

person rmanna    schedule 28.09.2011
comment
Это отлично работает для меня. Большое спасибо за обновленный ответ! Я бы хотел, чтобы ОП повторно продвигал этот, потому что фактический ответ (как вы указываете) на самом деле не будет работать с текущей спецификацией. Я заполнил остальную часть кода для простого инструмента командной строки, который прекрасно работает. Это может быть полезно кому-то еще: gist.github.com/1402238 Это просто ваш код с некоторыми очень незначительные другие вещи, которые в основном очевидны, но я надеюсь, что это сэкономит кому-то время. - person drewww; 29.11.2011
comment
какие-либо обновления по этому ответу по состоянию на 2019 год? - person PirateApp; 25.06.2018

Прежде всего, я не уверен, почему некоторые из ваших серверов Socket.IO не будут поддерживать веб-сокеты... цель Socket.IO состоит в том, чтобы упростить разработку веб-приложений во внешнем браузере, предоставив абстрактный интерфейс для реального -time потоки данных, обслуживаемые сервером Socket.IO. Возможно, Socket.IO — это не то, что вам следует использовать для своего приложения? Кроме того, позвольте мне попытаться ответить на ваш вопрос...

На данный момент не существует клиентских библиотек Socket.IO для Python (gevent-socketio не является клиентской библиотекой Socket.IO для Python... это Socket.IO серверную библиотеку для Python). На данный момент вам придется собрать исходный код, чтобы напрямую взаимодействовать с Socket.IO в качестве клиента, принимая различные типы соединений.

Я знаю, что вы ищете панацею, которая работает с различными типами соединений (WebSocket, long-polling и т. д.), но поскольку такой библиотеки пока не существует, я могу, по крайней мере, дать вам некоторые рекомендации по используя тип подключения WebSocket, основанный на моем опыте.

Для типа подключения WebSocket создайте клиент WebSocket в Python. Из командной строки установите этот пакет клиента Python WebSocket здесь с помощью pip, чтобы он находился на вашем пути к 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)
person Archie1986    schedule 31.05.2011
comment
полный пример: pastebin.com/1Xt6X4K5 - но на самом деле я не использую HTTP точно, мне пришлось изменить websocket .py примерно так: pastebin.com/rh9WxxJA, потому что я подозреваю, что моя версия urlparse не распознает 'ws //' протокол веб-сокета. - person Luke Stanley; 08.07.2011

Библиотека 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)
person Roy Hyunjin Han    schedule 09.08.2012
comment
Хех, мы прошли полный круг, увидев, что пакет socketIO-client был создан из соответствующего вопроса SO: stackoverflow.com/questions/6692908/ - person Maxy-B; 13.09.2012
comment
я получаю предупреждение ПРЕДУПРЕЖДЕНИЕ: root: localhost: 8000/socket.io [ожидание соединения] («Соединение прервано», ошибка (111, «Соединение отклонено»)) ... вы можете помочь? - person 3ppps; 07.04.2015
comment
Ваш сервер socket.io работает? Какую версию сервера socket.io вы используете? - person Roy Hyunjin Han; 07.04.2015
comment
Работает только одно событие socketIO.on('aaa_response', on_aaa_response). Если я добавляю несколько событий, работает только первое?? - person Wazy; 23.03.2016
comment
О-о, это не хорошо. Не могли бы вы опубликовать проблему в репозитории github с примером кода, чтобы мы могли воспроизвести вашу ситуацию? - person Roy Hyunjin Han; 23.03.2016
comment
@Wazzy У ваших нескольких событий разные имена или вы пытаетесь прикрепить несколько обратных вызовов к «aaa_response»? В настоящее время (начиная с версии 0.7.2) для каждого события может быть только один обратный вызов. - person Roy Hyunjin Han; 11.12.2016
comment
Привет, я также встретил [socket.io, ожидающий подключения], так какое исключение я должен здесь обработать и добавить time.sleep на некоторое время, а затем повторить попытку? - person Bing; 13.12.2016

Библиотека SocketTornad.IO с популярным асинхронным Веб-сервер Tornado также является одним из вариантов, доступных для Python.

person Sushant Khurana    schedule 27.02.2012
comment
или даже лучше, более свежая версия Tornadio2: github.com/mrjoes/tornadIO2 --- но это серверные библиотеки, не предназначенные для использования в качестве клиента. - person Alp; 08.06.2012

Написал один: https://github.com/amitu/amitu-websocket-client/blob/master/amitu/socketio_client.py. Он поддерживает только веб-сокеты, поэтому он может иметь для вас лишь незначительную пользу.

person Amit Upadhyay    schedule 17.12.2011
comment
при выполнении метода run() я получаю сообщение об ошибке: Invalid frame - что это может означать? - person Alp; 06.06.2012
comment
Альп, значит в библиотеке баг. Я обновил его на основе отзывов от разных участников. Пожалуйста, не стесняйтесь проверить последнюю версию и посмотреть, поможет ли она. - person Amit Upadhyay; 07.09.2012
comment
Спасибо за ответ. Тем временем я переключился на sockjs, который прекрасно работает. См. stackoverflow.com/questions/10950365/ - person Alp; 07.09.2012

Вы видели gevent-socketio?

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

person Sylvain    schedule 21.03.2011
comment
gevent-socketio не является клиентской библиотекой Socket.IO для Python... это серверная библиотека Socket.IO для Python - person Archie1986; 12.06.2011
comment
+1 Мне очень помогло, спасибо. - person Tom Leys; 26.04.2012