Socket.IO 客户端
本软件包包含两个 Socket.IO 客户端:
- “简单(simple)” 客户端:它提供了一种直观的 API,足以满足大多数应用程序的需求。
- “事件驱动(event-driven)” 客户端:它允许访问 Socket.IO 协议的所有功能。
每个客户端都有两个版本:一个用于标准 Python 库,另一个用于使用asyncio
包构建的异步应用程序。
安装
要安装标准 Python 客户端及其依赖项,请使用以下命令:
pip install "python-socketio[client]"
如果打算使用asyncio
客户端,则使用以下命令:
pip install "python-socketio[asyncio_client]"
使用简单客户端
简单客户端的优点在于,它抽象了维护 Socket.IO 连接所需的逻辑。这个客户端以完全透明的方式处理断开连接和重新连接,不会给应用程序增加任何复杂性。
创建客户端实例
创建 Socket.IO 客户端最简单的方法是使用上下文管理器接口:
# 标准Python
import socketio
with socketio.SimpleClient() as sio:
# ...连接到服务器并使用客户端
# ...无需手动断开连接!
# asyncio
import socketio
async with socketio.AsyncSimpleClient() as sio:
# ...连接到服务器并使用客户端
# ...无需手动断开连接!
使用这种方式时,上下文管理器会确保在退出with
或async with
代码块之前正确断开客户端连接。
如果愿意,也可以手动实例化客户端:
# 标准Python
import socketio
sio = socketio.SimpleClient()
# asyncio
import socketio
sio = socketio.AsyncSimpleClient()
连接到服务器
通过调用connect()
方法建立与服务器的连接:
sio.connect('http://localhost:5000')
对于asyncio
客户端,该方法是一个协程:
await sio.connect('http://localhost:5000')
默认情况下,客户端首先使用长轮询传输连接到服务器,然后尝试将连接升级为使用 WebSocket。要直接使用 WebSocket 连接,可以使用transports
参数:
sio.connect('http://localhost:5000', transports=['websocket'])
连接建立后,服务器会为客户端分配一个唯一的会话标识符。应用程序可以在sid
属性中找到这个标识符:
print('my sid is', sio.sid)
连接中使用的 Socket.IO 传输方式可以从transport
属性中获取:
print('my transport is', sio.transport)
传输方式以字符串形式给出,可以是'websocket'
或'polling'
。
TLS/SSL 支持
客户端支持 TLS/SSL 连接。要启用它,可以使用https://
连接 URL:
sio.connect('https://example.com')
在使用asyncio
时:
await sio.connect('https://example.com')
客户端默认会验证服务器证书。有关如何自定义此行为的信息,请参考事件驱动客户端的文档。
发送事件
客户端可以使用emit()
方法向服务器发送事件:
sio.emit('my message', {'foo': 'bar'})
在asyncio
中,则作为协程使用:
await sio.emit('my message', {'foo': 'bar'})
该方法的参数是要发送的事件名称和可选的数据,这些数据会被传递给服务器。数据类型可以是str
、bytes
、dict
、list
或tuple
。当发送list
或tuple
时,其中的元素必须是除tuple
之外的任何允许类型。当使用tuple
时,元组中的元素将作为单独的参数传递给服务器端的事件处理函数。
接收事件
客户端可以使用receive()
方法等待服务器发送事件:
event = sio.receive()
print(f'received event: "{event[0]}" with arguments {event[1:]}')
在使用asyncio
时,这个方法需要被等待:
event = await sio.receive()
print(f'received event: "{event[0]}" with arguments {event[1:]}')
receive()
的返回值是一个列表。这个列表的第一个元素是事件名称,其余元素是服务器传递的参数。
使用上述方法时,receive()<