Forum >> Programmazione Python >> Web e Reti >> Client TCP con asyncio

Pagina: 1

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()

Nessuno riesce ad aiutarmi?



Grazie
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
Daniele aka Palmux said @ 2017-11-07 19:04:22:
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

ok ti ringrazio


Pagina: 1



Esegui il login per scrivere una risposta.