Как реализовать сокеты UDP и TCP с помощью AsyncIo - PullRequest
0 голосов
/ 03 октября 2019

Так что технически я уже создал сокет прослушивания TCP и все работает нормально.

Он просто получает сообщение tcp json и выкладывает его.

class TCPListener(Base):
    def __init__(self,
                 address,
                 port,
                 buffer,
                 backlog,
                 **kwargs):
        self.tcp_address = address
        self.tcp_port = port
        self.tcp_buffer = buffer
        self.tcp_asyncio_backlog = backlog
        self.queue = queue.Queue()

    def __await__(self):
        self._server = yield from asyncio.start_server(
            self.__on_message,
            host=self.tcp_address,
            port=self.tcp_port,
            backlog=self.tcp_asyncio_backlog
        )
        return self

    async def __on_message(self, reader, writer):
        message = await reader.read(self.tcp_buffer)
        try:
            json_encoded = json.loads(message.decode('UTF-8').strip())
            self.queue.put(json_encoded)
        writer.close()

    def start(self):
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        asyncio.ensure_future(self, loop=loop)


    def receive(self):
        while self.queue.empty():
            sleep_random = random.randint(0, 1000)
            time.sleep(sleep_random / 1000.0)

        if not self.queue.empty():
            return self.queue.get(block=False)
        return '', ''

Теперь я пытаюсь заставить этот код работать для прослушивателя TCP и UDP. Интересно, какую функцию я могу сохранить и как я делю их между слушателем, не знаю, как с этим справиться! Если я не ошибаюсь, я должен использовать «create_datagram_endpoint», но все еще не знаю, как склеить его с этим классом и функциями.

...