如何用AioHTTP设置一个简单的Python WebSocket

697 阅读5分钟

如何用AioHTTP设置一个简单的Python WebSocket

一个Web Socket由两个重要的端点组成。一端发送数据,另一端接收数据。举个例子,你可以在互联网上做什么。在这种情况下,不同的节点/计算机被连接起来,建立一个连接,让你发送或接收数据。

一个节点可以是一个服务器或一个客户端。客户端发送一个请求,而服务器将发回一个响应。服务器和客户端之间的这些连接是通过套接字实现的。因此,套接字作为通信的终端。

本指南将通过使用AioHTTP构建客户-服务器套接字架构来帮助你理解套接字概念。

AioHTTP是一个用于Python和asyncio的异步HTTP客户端/服务器。

该库支持客户端和HTTP服务器,客户端WebSockets和服务器WebSockets,开箱即用,无需回调。

我们将通过用AioHTTP设置客户端和服务器并在客户端和服务器之间发送数据来建立一个WebSocket。

前提条件

  1. 在你的机器上安装Python 3.7或更高版本。
  2. 有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操作系统,在你的......中运行这个命令。
  1. Powershell终端
./Scripts/Activate.ps1
  1. 命令提示符
./Scripts/activate.bat
  • 对于Unix系统使用。
source /Scripts/activate

在这一点上,virtualenv已经设置好了,我们可以继续进行下一步。

安装AioHTTP

要安装AioHTTP以及相关模块,请运行以下命令。

pip install aiohttp[speedups]

上述命令将安装AioHTTP和以下软件包。

这些模块确保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来配置客户端。

导入aiohttpasyncio 模块。

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。