如何用AioHTTP设置一个简单的Python WebSocket
一个Web Socket由两个重要的端点组成。一端发送数据,另一端接收数据。举个例子,你可以在互联网上做什么。在这种情况下,不同的节点/计算机被连接起来,建立一个连接,让你发送或接收数据。
一个节点可以是一个服务器或一个客户端。客户端发送一个请求,而服务器将发回一个响应。服务器和客户端之间的这些连接是通过套接字实现的。因此,套接字作为通信的终端。
本指南将通过使用AioHTTP构建客户-服务器套接字架构来帮助你理解套接字概念。
AioHTTP是一个用于Python和asyncio的异步HTTP客户端/服务器。
该库支持客户端和HTTP服务器,客户端WebSockets和服务器WebSockets,开箱即用,无需回调。
我们将通过用AioHTTP设置客户端和服务器并在客户端和服务器之间发送数据来建立一个WebSocket。
前提条件
- 在你的机器上安装Python 3.7或更高版本。
- 有Python编程的基本知识。
使用virtualenv建立一个虚拟环境
Virtualenv是一个用于创建独立Python环境的库。我们安装的所有库都将在本地为我们的项目安装。首先,创建一个项目文件夹并在命令行中打开它。
然后通过运行以下命令安装virtualenv。
pip3 install virtualenv
如果你已经预装了virtualenv,确保你的pip是最新的,从终端运行以下命令。
pip --version
你可以通过运行以下命令来检查你电脑上安装的virtualenv的版本。
which virtualenv
如果virtualenv的版本不是最新的,运行这个命令来获得最新的安装版本。
python3 -m pip install --upgrade pip
这将输出已经安装的virtualenv的路径。使用virtualenv为这个项目初始化环境
python3 -m virtualenv .
然后运行Activate ,通过运行来激活这个环境。
- 对于Windows操作系统,在你的......中运行这个命令。
- Powershell终端
./Scripts/Activate.ps1
- 命令提示符
./Scripts/activate.bat
- 对于Unix系统使用。
source /Scripts/activate
在这一点上,virtualenv已经设置好了,我们可以继续进行下一步。
安装AioHTTP
要安装AioHTTP以及相关模块,请运行以下命令。
pip install aiohttp[speedups]
上述命令将安装AioHTTP和以下软件包。
-
Charset-normalizer: 一个通用的字符集检测器。
-
Aiodns:一个用于asyncio的DNS解析器。
-
Brotli。一个数据压缩库。
这些模块确保AioHTTP模块在接收和发送请求时尽可能的快。
用AioHTTP建立一个服务器
在项目文件夹中创建一个server.py 文件。我们将在这里配置一个AioHTTP服务器。
从aiohttp 库中导入web 模块。
from aiohttp import web
网络模块将使我们能够创建一个本地网络服务器。首先,添加一个假的todos列表。
todos = [
{"id":"1","title":"Go to the garden"},
{"id":"2","title":"Go to the market"},
{"id":"3","title":"Prepare dinner"},
]
这个假数据将是客户端调用时服务器的响应。
创建一个处理函数,用来发送假数据。
async def handle(request):
return web.json_response(todos)
注意,处理程序是一个async 函数,返回JSON 数据。
- 初始化应用程序,设置带有监听器的路由,并添加用于启动服务器的脚本,如下所示。
app = web.Application()
app.add_routes([web.get('/', handle),
web.get('/todos', handle)])
if __name__ == '__main__':
web.run_app(app)
这里我们以/ 路由和/todos 路由为目标,这两个路由将由同一个函数处理。我们还通过运行应用程序实例来启动我们的服务器。
你可以通过在你的终端上运行以下命令来启动服务器。在运行该命令之前,确保你是在存放server.py 文件的项目文件夹中。
./Scripts/python server.py
你的反应应该类似于。
========= Running on http://0.0.0.0.8080 =======
服务器已经启动并运行,正如你所看到的,服务器正在监听端口8080 。
用AioHTTP建立一个客户端
在项目文件夹中创建一个client.py 文件。接下来,让我们用AioHTTP来配置客户端。
导入aiohttp 和asyncio 模块。
import aiohttp
import asyncio
-
aiohttp将创建一个客户端会话,它将监听服务器。 -
asyncio将初始化一个客户端将监听的事件循环。
创建一个方法来创建客户端会话和监听服务器。
async def main():
async with aiohttp.ClientSession() as session:
async with session.get('http://localhost:8080/todos') as response:
print(response.status)
print(await response.json())
在这里,我们正在创建一个客户端会话,等待来自本地服务器的响应,并打印出服务器的状态和JSON 响应。
初始化一个事件循环,在事件循环中运行main 函数,直到完成。
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
只有当main 函数完全执行后,事件循环才会关闭。
在客户端和服务器之间发送数据
为了发送客户端和服务器的数据,我们需要运行client.py 文件来接收我们从服务器设置的假数据。
在你的终端上打开一个单独的标签,在项目文件夹内运行以下命令。
./Scripts/python client.py
上述命令将运行client.py 文件内的main 函数,你的响应应该与之相当。
200
[
{
'id':'1',
'title': 'Go to the garden'
},
{
'id':'2',
'title': 'Go to the market'
},
{
'id':'3',
'title': 'Prepare dinner'
}
]
结论
我们通过设置AioHTTP服务器和客户端并在它们之间发送数据,建立了一个简单的WebSocket。