Forum
>>
Programmazione Python
>>
Web e Reti
>>
Client TCP con asyncio
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
Scritto da vinny74 |
2017-11-05 11:14:07 - Client TCP con asyncio
|
Ciao a tutti prendendo vari esempi dal web (diciamo pure copiando) sono riuscito a scrivere questo piccolo client TCP con asyncio, e che in caso di chiusura del server tenta la riconnessione, inoltre tramite una coroutine invia dei messaggi al server per il momento ad intervalli regolari in maniera autonoma, il mio problema è che se il server chiude la connessione non sempre ma spesso mi ritrovo col client che mi genera questo errore "Task was destroyed but it is pending!", ho letto qualcosa a riguardo ma non riesco a venirne a capo, vi posto il codice spero riusciate ad aiutarmi.
Grazie import asyncio class EchoClientProtocol(asyncio.Protocol): def __init__(self, username, loop): self.transport = None self.username = username self.loop = loop self.queue = asyncio.Queue() self._ready = asyncio.Event() asyncio.async(self._send_messages()) @asyncio.coroutine def _send_messages(self): """ Send messages to the server as they become available. """ yield from self._ready.wait() print("Ready!") while self._ready.is_set(): data = yield from self.queue.get() self.transport.write(data.encode('utf-8')) print('Message sent: {!r}'.format(data)) @asyncio.coroutine def send_message(self, data): """ Feed a message to the sender coroutine. """ yield from self.queue.put(data) def connection_made(self, transport): self.transport = transport transport.write(self.username.encode('utf-8' )) print('Data sent: {!r}'.format(self.username)) self._ready.set() def data_received(self, data): print('Data received: {!r}'.format(data.decode('utf-8'))) def connection_lost(self, exc): print('The server closed the connection') #print('Stop the event loop') self._ready.clear() @asyncio.coroutine def feed_messages(self): """ An example function that sends the same message repeatedly. """ message = 'test_1\n' while self._ready.is_set(): yield from self.send_message(message) yield from asyncio.sleep(3.0) @asyncio.coroutine def tcp_client(message, loop, host, port): _, proto = yield from loop.create_connection( lambda: EchoClientProtocol(message, loop), host, port) yield from asyncio.sleep(1) yield from asyncio.async(proto.feed_messages()) @asyncio.coroutine def tcp_reconnect(message, loop, host, port): while True: print('Connessione in corso') try: yield from tcp_client(message, loop, host, port) except ConnectionRefusedError: print('Connessione Rifiutata') except asyncio.TimeoutError: print('Timeout') except OSError: print('Connessione Fallita') else: print('Connessione chiusa') yield from asyncio.sleep(3.0) if __name__ == '__main__': try: host ='localhost' port = 8888 username = 'client_1\n' loop = asyncio.get_event_loop() loop.run_until_complete(tcp_reconnect(username, loop, host, port)) except KeyboardInterrupt: loop.close() |
|
Scritto da vinny74 |
2017-11-07 18:16:54 - Re: Client TCP con asyncio
|
Nessuno riesce ad aiutarmi?
Grazie |
|
Scritto da Daniele aka Palmux |
2017-11-07 19:04:22 - Re: Client TCP con asyncio
|
Ciao caro, purtroppo io non so aiutarti nel caso specifico, ma ti posso suggerire di porre la stessa domanda anche sulla nostra mailing list.
Cya |
|
Scritto da vinny74 |
2017-11-08 12:41:45 - Re: Client TCP con asyncio
|
ok ti ringrazio
|
Pagina: 1
Esegui il login per scrivere una risposta.