Пример #1
0
class Server:
    def __init__(self, local_addr, remote_addr, loop):
        self.local_addr = local_addr
        self.remote_addr = remote_addr
        self.loop = loop or asyncio.get_event_loop()
        self.manager = ServerManager(local_addr=local_addr, loop=self.loop)

    async def start(self):
        await self.manager.start()
        while True:
            kcp = await self.manager.accept()
            self.loop.create_task(self.dispatcher(kcp))

    async def dispatcher(self, kcp):
        reader, writer = await asyncio.open_connection(self.remote_addr[0],
                                                       self.remote_addr[1],
                                                       loop=self.loop)
        pending = {self.manager.recv(kcp), self.read(reader)}
        try:
            while True:
                done, pending = await asyncio.wait(
                    pending,
                    return_when=asyncio.FIRST_COMPLETED,
                    loop=self.loop)
                for task in done:
                    flag, data = task.result()
                    if flag == 'recv':
                        writer.write(data)
                        await writer.drain()
                        pending.add(self.manager.recv(kcp))
                    elif flag == 'read':
                        self.manager.send(kcp, data)
                        pending.add(self.read(reader))
                    else:
                        pass
        except (asyncio.CancelledError, Exception) as err:
            print(err)
        finally:
            writer.close()
            self.manager.close(kcp)

    async def read(self, reader):
        return 'read', (await reader.read(1024))