Python中的Socket.IO客户端库

Ada*_*Ada 49 python client-server socket.io

任何人都可以为Python推荐一个Socket.IO客户端库吗?我已经浏览了一下,但我能找到的唯一一个是服务器实现,或者依赖于像Twisted这样的框架.

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

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

rma*_*nna 41

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)

....
Run Code Online (Sandbox Code Playgroud)

您可能还想阅读python-websockets:https://github.com/mtah/python-websocket

  • 这对我很有用.非常感谢您更新的答案!我希望OP能够重新推广这个,因为实际的答案(正如你所指出的)并不能真正适用于当前的规范.我填写了其余的代码,以获得一个很好用的简单命令行工具.它可能对其他人有用:https://gist.github.com/1402238它基本上只是你的代码中有一些非常小的其他东西,这些东西最明显,但我希望它能节省一些时间. (3认同)
  • 截至 2019 年,此答案有任何更新吗? (2认同)

Arc*_*986 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_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)
Run Code Online (Sandbox Code Playgroud)

此时,您可以直接从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)
Run Code Online (Sandbox Code Playgroud)


Roy*_*Han 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)
Run Code Online (Sandbox Code Playgroud)

定义事件.

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)
Run Code Online (Sandbox Code Playgroud)

在命名空间中定义事件.

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)
Run Code Online (Sandbox Code Playgroud)

在单个套接字上定义不同的命名空间.

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)
Run Code Online (Sandbox Code Playgroud)

  • 嘿,我们已经完整了,因为socketIO-client软件包是从相关的SO问题中产生的:http://stackoverflow.com/questions/6692908/formatting-messages-to-send-to-socket-io-节点-JS-服务器从-python的客户端 (3认同)

Sus*_*ana 5

带有流行的异步Tornado Web ServerSocketTornad.IO库也是python可用的选项之一.

  • 甚至更好,Tornadio2的当前版本:https://github.com/mrjoes/tornadIO2 ---但这些是服务器库,不打算用作客户端. (2认同)