谁能为Python推荐socket.io客户库库?我环顾四周,但是我唯一能找到的是服务器实现,或者取决于扭曲之类的框架。

我需要一个对其他框架没有依赖性的客户库。

简单地使用众多连接类型之一不够,因为Python客户端将需要与多个套接字服务器一起使用,例如,其中许多服务器不支持WebSockets。

有帮助吗?

解决方案

Archie1986的答案很好,但已经过时了插座更新(更具体地说,其协议: https://github.com/learnboost/socket.io-pec)...据我所知,您需要手动执行握手,然后才能要求运输(例如,WebSocket)连接...请注意,下面的代码不完整且不安全...忽略握手响应中返回的受支持的运输列表,并始终试图获得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-Websocket上阅读: https://github.com/mtah/python-websocket

其他提示

首先,我不确定为什么您的某些socket.io服务器不支持WebSocket ... socket.io的意图是通过为真实提供抽象的界面来使Web应用程序的前端浏览器开发更加容易 - socket.io服务器提供的时间数据流。也许socket.io不是您应该使用的应用程序吗?除此之外,让我尝试回答您的问题...

此时,没有任何socket.io客户端库(gevent-socketio不是socket.io) 客户 Python的库...这是一个socket.io 服务器 Python的图书馆)。目前,您必须将一些原始代码拼凑在一起,以便在接受各种连接类型的同时直接与socket.io接口。

我知道您正在寻找一种可以在各种连接类型(WebSocket,长纸上等)上使用的全部治疗方法,但是由于此类库尚未存在,因此我至少可以为您提供一些指导根据我的经验使用Websocket连接类型。

对于WebSocket连接类型,请在Python中创建WebSocket客户端。从命令行安装此Python Websocket客户端包 这里 使用pip使其在您的python路径上如此:

pip install -e git+https://github.com/liris/websocket-client.git#egg=websocket

完成此操作后,请尝试以下内容,更换 SOCKET_IO_HOSTSOCKET_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 client通过此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 库支持事件回调和频道,这要归功于贡献者的工作,可以在 PYPI 根据麻省理工学院许可证。

发出回调。

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 具有流行异步的图书馆 龙卷风Web服务器 也是Python可用的选项之一。

写一个: https://github.com/amitu/amitu-websocket-client/blob/master/amitu/socketio_client.py. 。它仅支持Websockets,因此它可能只为您提供边际实用程序。

你看了看吗 gevent socketio?

希望能帮助到你。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top