Je veux construire une démo de chat, mais je ne peux pas recevoir les choses côté serveur envoyées, en plus de la première fois pour commencer, quelqu'un sait pourquoi? Code de https://docs.python.org/3.4/library/asyncio-protocol.html#tcp-echo-client-protocolpython3.5 asyncio Protocole
Server.py
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))
print('Send: {!r}'.format(message))
self.transport.write(data)
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()
Client.py
class EchoClientProtocol(asyncio.Protocol):
def __init__(self, message, loop):
self.message = message
self.loop = loop
self.transport = None
def connection_made(self, transport):
self.transport = transport
transport.write(self.message.encode())
print('Data sent: {!r}'.format(self.message))
# while 1:
# message=input('please input the message:')
# transport.write(message.encode())
# print('Data sent: {!r}'.format(message))
def data_received(self, data):
# print('data_received')
print('Data received: {!r}'.format(data.decode()))
while 1:
message = input('please input the message:')
self.transport.write(message.encode())
print('Data sent: {!r}'.format(message))
def connection_lost(self, exc):
print('The server closed the connection')
print('Stop the event loop')
self.loop.stop()
loop = asyncio.get_event_loop()
message = 'Hello World!'
coro = loop.create_connection(lambda: EchoClientProtocol(message, loop),
'127.0.0.1', 8888)
loop.run_until_complete(coro)
loop.run_forever()
loop.close()
résultat show: ne peux pas montrer pas 'Les données reçues: '#####' comme' def data_received (self, data) 'est seulement utilisé onece quelqu'un at-il une solution? [résultat] [1] [1]: https://i.stack.imgur.com/IoqA9.png
Je recommande également d'utiliser 'aioconsole' (et déplacez sur data_received à une boucle future "background" indépendante) pour attendre l'entrée de l'utilisateur de manière asynchrone. Parce que même avec le correctif @Qeek, la communication est synchrone - vous ne pourrez pas recevoir de données alors que vous êtes dans 'l'entrée'. – kwarunek