Advertisement

Udp广播,线程发送与接收数据

阅读量:
复制代码
 ''' Udp广播,线程发送和接收数据。   广播的核心是bind和setsockopt '''

    
 #! python3
    
 # encoding: utf-8
    
  
    
 import socket
    
 import threading
    
 import time
    
  
    
 def upd_send(udpSocket):
    
     ip = '<broadcast>'
    
     port = 51213
    
     room = 1
    
     subnet = 2
    
     device = 3
    
     i = 0
    
 #字符串设置为16进制使用bytes().fromhex()。   设置带参数为16进制,并且参数位宽为2,不够用0填充,使用%02x,(跟c sprintf()参数一样格式)
    
     while True:
    
             if (i % 2 == 0):
    
         data = bytes().fromhex('a7a800000018000000%02x%02x000300c010d06b'%(subnet,device))
    
     else:
    
         data = bytes().fromhex('a7a8000000180000%02x%02x%02x000300c010d06b'%(room,subnet,device))
    
     #data = str(data,encoding = 'utf-8')
    
     udpSocket.sendto(data,(ip,port))
    
     time.sleep(5)
    
     i+=1
    
     room+=1
    
     subnet+=1
    
     device+=1
    
  
    
  
    
 def udp_recv(udpSocket):
    
     while True:
    
     recvData = udpSocket.recv(1024);
    
     recvData = recvData.decode('utf-8')
    
     print("收到信息%s"%recvData)
    
  
    
 def main():
    
     udp_send_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
     udp_send_socket.bind(('',0))
    
     udp_send_socket.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
    
     t = threading.Thread(target=upd_send,args=(udp_send_socket,))
    
  
    
     udp_recv_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
     udp_recv_socket.bind(('',53121))
    
     t1 = threading.Thread(target=udp_recv,args=(udp_recv_socket,))
    
     t.start()
    
     t1.start()
    
  
    
 if __name__ == '__main__':
    
     main()
    
    
    
    
    AI写代码

全部评论 (0)

还没有任何评论哟~