Асинхронный код Python с UDP

Могу ли я написать приложение клиент/сервер UDP в asyncore? Я уже написал один, используя TCP. Мое желание - интегрировать его с поддержкой UDP.

Мой вопрос ранее не задавался/не отвечал следующим образом: Python asyncore UDP server


person splinux    schedule 02.12.2015    source источник


Ответы (3)


Да, ты можешь. Вот простой пример:

class AsyncoreSocketUDP(asyncore.dispatcher):

  def __init__(self, port=0):
    asyncore.dispatcher.__init__(self)
    self.create_socket(socket.AF_INET, socket.SOCK_DGRAM)
    self.bind(('', port))

  # This is called every time there is something to read
  def handle_read(self):
    data, addr = self.recvfrom(2048)
    # ... do something here, eg self.sendto(data, (addr, port))

  def writable(self): 
    return False # don't want write notifies

Этого должно быть достаточно, чтобы вы начали. Загляните внутрь модуля asyncore, чтобы найти больше идей.

Небольшое примечание: asyncore.dispatcher устанавливает сокет как неблокирующий. Если вы хотите быстро записать много данных в сокет, не вызывая ошибок, вам придется выполнить некоторую буферизацию, зависящую от приложения, например asyncore.dispatcher_with_send.

Спасибо за (слегка неточный) код, который помог мне начать работу: https://www.panda3d.org/forums/viewtopic.php?t=9364

person bw1024    schedule 04.08.2016
comment
Спасибо за self.sendto(data, (addr, port)) - person moonraker; 25.05.2017

После долгих поисков ответ нет. Asyncore предполагает, что базовый сокет ориентирован на соединение, то есть TCP.

person splinux    schedule 22.01.2016

Привет, спасибо @bw1024 за указание в правильном направлении, я добавлю свое решение, вдохновленное вашим, pandas и документацией по асинхронному python.

Мой вариант использования — захват некоторого JSON из потока UDP.

`

импорт сокета, импорт json, импорт асинкора

UDP_IP = '127.0.0.1' UDP_PORT = 2000

class AsyncUDPClient(asyncore.dispatcher): def init(self, host, port): asyncore.dispatcher.init(self) self.create_socket(socket.AF_INET, socket. SOCK_DGRAM) self.bind((хост, порт)) print(connecting.. host = '{0}'' port = '{1}' .format(host, str(port)))

def handle_connect(self):
    print("connected")


def handle_read(self):
    data = self.recv(1024)
    y = json.loads(data)
    print("PM 2.5 ug/m^3 async : %s "% y['PM25MassPerM3'])

def writable(self):
    return False;

клиент = AsyncUDPClient (UDP_IP, UDP_PORT)

asyncore.loop()

`

P.S не уверен, почему код неправильно отформатирован, он работает на python 3.6.9. Хорошо, вот ссылка < /a> к сути

person Ganindu    schedule 20.04.2021