Python 如果没有收到数据,UDP 套接字发送数据

Python UDP socket resend data if no data recieved

我想向传感器发送一些数据,如果 python 脚本没有收到数据,我希望接收函数超时并重新发送数据。

def subscribe():
   UDP_IP = "192.168.1.166"
   UDP_PORT = 10000
   MESSAGE = '6864001e636caccf2393730420202020202004739323cfac202020202020'.decode('hex')
   print "UDP target IP:", UDP_IP
   print "UDP target port:", UDP_PORT
   print "message:", MESSAGE
   sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
   sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
   recieve_data = recieve()
   if recieve_data == subscribe_recieve_on or recieve_data == subscribe_recieve_off:
       logging.info('Subscribition to light successful')
   else:
       logging.info('Subscribition to light unsuccessful')

def recieve():
   UDP_IP = "192.168.1.118"
   UDP_PORT = 10000
   sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP    
   sock.bind((UDP_IP, UDP_PORT))
   data, addr = sock.recvfrom(1024)
   return data.encode('hex')

subscribe()

目前收不到数据会卡在接收函数中:

data, addr = sock.recvfrom(1024)

但是我希望它在例如之后超时。 2 秒并重新运行 subscribe() 函数。

我试过使用带超时的 while true 语句,try/exception 但是即使关闭端口,我也得到了当前正在使用的端口。也觉得这样很乱

如有任何想法,我们将不胜感激。

您得到 "currently in use" 异常,因为您每次调用这些函数中的任何一个时都在重新创建套接字,而没有先关闭它们。

尝试预先创建套接字。响应可能会在创建接收套接字之前出现,在这种情况下,数据包将被拒绝。

那么你应该只在循环中尝试 sendto-recvfrom 调用。

另外你需要设置一个超时settimeout on the receiving socket so it does not get blocked then catch the timeout exception or use a polling mechanism like select or poll来检查你是否收到了任何数据。