Sto imparando sulla libreria asyncio di python 3 e ho riscontrato un piccolo problema. Sto cercando di adattare l'esempio EchoServer dai documenti python per richiedere l'input dell'utente piuttosto che solo quello che il client invia.Richiesta di input utente utilizzando l'istanza di python asyncio.create_server
Ho pensato che sarebbe stato semplice come aggiungere una chiamata a input(), ma ovviamente input() verrà bloccato fino a quando non viene immesso dall'utente che causa i problemi.
Idealmente mi piacerebbe continuare a ricevere dati dal client anche quando il server non ha nulla da "dire". Un po 'come un client di chat in cui ogni connessione sta chattando con il server. Mi piacerebbe essere in grado di passare a-e-da ogni singola connessione e inviare l'input secondo necessità da stdin. Quasi come un client di chat P2P.
Si consideri il seguente codice EchoServer modificato:
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()
Come potrei fare per ottenere modulo di input stdin sul lato server e specificare quale connessione ad inviarlo a mentre ancora ricevuto input da parte dei clienti collegati?
Avevo il sospetto che dovevo usare una coda come questa, ma non ero sicuro di come implementare. Grazie per l'ottima risposta! Funziona bene. – RG5