Вопрос

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

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

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

Это было полезно?

Решение

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

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 не будут поддерживать веб-токеты ... Цель Socket.io состоит -вчатно потоки данных обслуживаются сервером socket.io. Возможно, Socket.io - это не то, что вы должны использовать для вашего приложения? В стороне, позвольте мне попытаться ответить на ваш вопрос ...

На данный момент нет клиентских библиотек сокета. клиент Библиотека для Python ... это сокет.io сервер Библиотека для Python). На данный момент вам придется собрать несколько оригинальных кодов вместе, чтобы взаимодействовать с Socket.io напрямую в качестве клиента, принимая различные типы соединений.

Я знаю, что вы ищете все, что работает по различным типам соединений (WebSocket, длительный срок и т. Д.), Но поскольку такая библиотека, как это, пока не существует, я могу, по крайней мере, дать вам некоторое руководство по Использование типа подключения 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.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)

А Сокета-клиент Библиотека поддерживает обратные вызовы и каналы событий благодаря работе участников и доступны на Пипи По лицензии 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 библиотека с популярным асинхронным Торнадо веб -сервер также один из вариантов, доступных для Python.

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

Вы посмотрели на Gevent-Socketio?

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top