我正在尝试使用 Python 的 asyncio 一起运行多个服务器,并在它们之间传递数据。对于我的具体情况,我需要一个带有 websocket 的 Web 服务器、与外部设备的 UDP 连接以及数据库和其他交互。我可以找到几乎所有这些单独的示例,但我正在努力找出正确的方法,让它们与在它们之间推送数据的同时运行。
我在这里找到的最接近的是:在 asyncio 协议/服务器之间进行通信 https://stackoverflow.com/q/25625153/868546(虽然我一直无法让它在Python 3.6上运行)
对于更具体的示例:我如何从以下位置获取以下 aiohttp 示例代码https://github.com/aio-libs/aiohttp https://github.com/aio-libs/aiohttp:
from aiohttp import web
async def handle(request):
name = request.match_info.get('name', "Anonymous")
text = "Hello, " + name
return web.Response(text=text)
async def wshandler(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
async for msg in ws:
if msg.type == web.MsgType.text:
await ws.send_str("Hello, {}".format(msg.data))
elif msg.type == web.MsgType.binary:
await ws.send_bytes(msg.data)
elif msg.type == web.MsgType.close:
break
return ws
app = web.Application()
app.router.add_get('/echo', wshandler)
app.router.add_get('/', handle)
app.router.add_get('/{name}', handle)
web.run_app(app)
以及以下 TCP 回显服务器示例(http://asyncio.readthedocs.io/en/latest/tcp_echo.html http://asyncio.readthedocs.io/en/latest/tcp_echo.html):
import asyncio
async def handle_echo(reader, writer):
data = await reader.read(100)
message = data.decode()
addr = writer.get_extra_info('peername')
print("Received %r from %r" % (message, addr))
print("Send: %r" % message)
writer.write(data)
await writer.drain()
print("Close the client socket")
writer.close()
loop = asyncio.get_event_loop()
coro = asyncio.start_server(handle_echo, '127.0.0.1', 8888, loop=loop)
server = loop.run_until_complete(coro)
# Serve requests until Ctrl+C is pressed
print('Serving on {}'.format(server.sockets[0].getsockname()))
try:
loop.run_forever()
except KeyboardInterrupt:
pass
# Close the server
server.close()
loop.run_until_complete(server.wait_closed())
loop.close()
并将它们组合成一个脚本,其中通过 websockets 或 TCP 回显服务器接收到的任何消息都会发送到其中任一客户端的所有客户端?
我将如何添加一段代码(例如)每秒向所有客户端发送一条消息(为了论证当前时间戳)?