Могу ли я написать приложение клиент/сервер UDP в asyncore? Я уже написал один, используя TCP. Мое желание - интегрировать его с поддержкой UDP.
Мой вопрос ранее не задавался/не отвечал следующим образом: Python asyncore UDP server
Могу ли я написать приложение клиент/сервер UDP в asyncore? Я уже написал один, используя TCP. Мое желание - интегрировать его с поддержкой UDP.
Мой вопрос ранее не задавался/не отвечал следующим образом: Python asyncore UDP server
Да, ты можешь. Вот простой пример:
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
self.sendto(data, (addr, port))
- person moonraker; 25.05.2017
После долгих поисков ответ нет. Asyncore предполагает, что базовый сокет ориентирован на соединение, то есть TCP.
Привет, спасибо @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> к сути