我正在学习Python 3的asyncio库,并遇到了一个小问题。我试图修改Python官方文档中的EchoServer示例,使其提示用户输入而不仅仅是回显客户端发送的内容。
我认为只需要添加input()调用就可以了,但是input()会阻塞,直到有用户输入,这会导致问题。
理想情况下,即使服务器没有“话要说”,我也希望能够继续从客户端接收数据。有点像一个聊天客户端,每个连接都在与服务器聊天。我希望能够在每个单独的连接之间切换并根据需要从stdin发送输入,类似于P2P聊天客户端。
考虑以下修改后的EchoServer代码:
import asyncio
class EchoServerClientProtocol(asyncio.Protocol):
def connection_made(self, transport):
peername = transport.get_extra_info('peername')
print('Connection from {}'.format(peername))
self.transport = transport
def data_received(self, data):
message = data.decode()
print('Data received: {!r}'.format(message))
reply = input()
print('Send: {!r}'.format(reply))
self.transport.write(reply.encode())
#print('Close the client socket')
#self.transport.close()
loop = asyncio.get_event_loop()
# Each client connection will create a new protocol instance
coro = loop.create_server(EchoServerClientProtocol, '127.0.0.1', 8888)
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()
我应该如何在服务器端从stdin获取输入,并指定要发送到哪个连接,同时仍然接收来自已连接客户端的输入?