49

任何人都可以推荐 Python 的 Socket.IO 客户端库吗?我环顾四周,但我唯一能找到的要么是服务器实现,要么依赖于诸如 Twisted 之类的框架。

我需要一个不依赖于其他框架的客户端库。

仅使用多种连接类型中的一种是不够的,因为 python 客户端将需要使用多个 socketio 服务器,例如,其中许多服务器不支持 websocket。

4

6 回答 6

43

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

于 2011-09-28T16:17:45.807 回答
25

首先,我不确定为什么你们的一些 Socket.IO 服务器不支持 websockets……Socket.IO 的目的是通过提供一个抽象的接口来让 web 应用程序的前端浏览器开发更容易。 - 由 Socket.IO 服务器提供的时间数据流。也许 Socket.IO 不是您应该为您的应用程序使用的?除此之外,让我试着回答你的问题......

目前,没有任何适用于 Python 的 Socket.IO 客户端库(gevent-socketio 不是适用于 Python 的 Socket.IO客户端库……它是适用于 Python 的 Socket.IO服务器库)。现在,您必须将一些原始代码拼凑在一起,以便在接受各种连接类型的同时直接作为客户端与 Socket.IO 交互。

我知道您正在寻找一种适用于各种连接类型(WebSocket、长轮询等)的万能药,但由于目前尚不存在这样的库,我至少可以为您提供一些指导根据我的经验使用 WebSocket 连接类型。

对于 WebSocket 连接类型,在 Python 中创建一个 WebSocket 客户端。从命令行使用 pip在此处安装此 Python WebSocket 客户端包,使其位于您的 python 路径中,如下所示:

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

完成后,请尝试以下操作,将Socket.IO 服务器的适当位置替换为SOCKET_IO_HOST和:SOCKET_IO_PORT

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 客户端通过此 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)
于 2011-05-31T21:03:58.403 回答
22

由于贡献者的工作, socketIO-client库支持事件回调和通道,并且在 MIT 许可下可在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)
于 2012-08-09T12:35:25.683 回答
5

带有流行的异步Tornado Web 服务器SocketTornad.IO库也是 python 可用的选项之一。

于 2012-02-27T14:15:57.240 回答
4

写了一个:https ://github.com/amitu/amitu-websocket-client/blob/master/amitu/socketio_client.py 。它只支持 websockets,所以它对你来说可能只有边际效用。

于 2011-12-17T17:36:03.573 回答
2

你看过gevent-socketio吗?

希望能帮助到你。

于 2011-03-21T23:48:56.977 回答