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来检查你是否收到了任何数据。
我想向传感器发送一些数据,如果 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来检查你是否收到了任何数据。