Я использую Twisted в программе python. Я отправляю данные каждую минуту и получаю данные по сокету UDP, и мне нужно установить тайм-аут.Установить тайм-аут для UDP-сокета с Twisted (python)
Я нашел способ сделать это, но я хотел бы знать, если это хороший способ сделать это.
Это идея моего кода:
class UDPSocket(DatagramProtocol):
def startProtocol(self):
self.transport.connect(self.HOST, self.PORT)
reactor.callLater(1, self.send_data)
def send_data(self):
reactor.callLater(60, self.send_data)
self.transport.write("Some data")
self.timeoutCallId = reactor.callLater(5, raise_timeout)
def datagramReceived(self, data, (host, port)):
if self.timeoutCallId.active():
self.timeoutCallId.cancel()
#Do something with data
def raise_timeout(self):
#Do something to manage timeout
reactor.listenUDP(port, UDPSocket())
reactor.run()
Спасибо за ваши советы
EDIT:
Это работает, но у меня есть проблема.
Если произошел тайм-аут, я правильно вхожу в функцию raise_timeout, но когда вызывается следующая «send_data()», функция self.transport.write («data») вызывает исключение: «NoneType 'объект не имеет атрибута' write '.
Я предполагаю, что сам.транспорт отключен.
Как это исправить?
- это зависит от вашего конкретного случая использования? –
Я просто хочу создать тайм-аут. Как и в библиотеке сокетов, когда мы использовали «socket.settimeout (5)» для повышения ошибки таймаута, когда мы это делаем »socket.recvfrom (1024)» – Damgot
И какова цель тайм-аута? Если мы не получаем подтверждение в x раз, мы поднимаем тайм-аут и прерываем? Разве это не TCP? –