小编RG5*_*RG5的帖子

使用python asyncio.create_server实例提示用户输入

我正在学习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 …
Run Code Online (Sandbox Code Playgroud)

python python-asyncio

18
推荐指数
1
解决办法
5761
查看次数

标签 统计

python ×1

python-asyncio ×1