我正在用Python开发一个简单的服务器/客户端聊天程序。该程序应允许多个用户一次连接,然后并发执行他们的请求。为此,我正在使用asyncio
模块和sockets
。
async def accept_new_connections(socket):
socket.listen(1)
while True:
connection, client_address = sock.accept()
print("accepted conn")
asyncio.create_task(accept_commands(socket, connection))
async def accept_commands(socket, connection):
print("accept cmd started")
while True:
# get and execute commands
def main():
asyncio.run(accept_new_connections(socket))
main()
我希望为每个连接运行accept_commands
,然后将同时执行命令。但是,当前代码仅对第一个连接启动accept_commands
,并阻塞while循环(accept_new_connections
中的那个)。
知道要为每个连接启动accept_command
时需要更改什么吗?
答案 0 :(得分:1)
很难说出来,因为您的示例确实实现了accept_commands
,但是基于您的问题,您可能需要在事件循环本身上使用异步套接字方法,以便协程可以产生执行和让其他事情发生。
以下示例显示了如何执行此操作。这将在端口8080上启动套接字,并将接收到的所有数据发送回客户端。通过将两个客户端与netcat
或telnet
连接并发送数据,您可以同时看到此工作。
import asyncio
import socket
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind(('localhost', 8080))
socket.listen(1)
socket.setblocking(False)
loop = asyncio.new_event_loop()
async def main():
while True:
connection, client_address = await loop.sock_accept(socket)
print('connected')
loop.create_task(accept_commands(connection))
async def accept_commands(connection):
while True:
request = await loop.sock_recv(connection, 16)
await loop.sock_sendall(connection, request)
loop.run_until_complete(main())