Python中的Socket.IO客户端库

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

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

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

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

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

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

我知道你正在寻找一种可以在各种连接types(WebSocket,long-polling等)中工作的万能药,但是由于像这样的库还没有存在,所以我至less可以给你一些指导。根据我的经验使用WebSocket连接types。

对于WebSocket连接types,使用Python创build一个WebSocket客户端。 从命令行安装这个Python WebSocket客户端包在这里与PIP,以便它在您的Pythonpath如下所示:

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

完成之后,请尝试以下操作,将SOCKET_IO_HOSTSOCKET_IO_PORTreplace为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客户端通过这个WebSocket传入的消息,你需要遵循Socket.IO协议并且编码你可能通过WebSocket连接发送的任何string或字典。 例如,完成上述所有操作后,请执行以下操作:

 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库支持事件callback和通道,这要归功于贡献者的工作,可以在MIT许可证下的PyPI上find。

用callback消除。

 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) 

带有stream行的asynchronousTornado Web服务器SocketTornad.IO库也是Python可用的选项之一。

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

你有没有看过gevent-socketio ?

希望能帮助到你。