TA的每日心情 | 慵懒 2015-8-11 09:37 |
---|
签到天数: 12 天 连续签到: 1 天 [LV.3]偶尔看看II
|
文章经过作者同意并委托转载
地址:文章地址
树莓派 Python UDP编程
UDP是TCP之外的另一重要协议,由于没有连接和应答机制,UDP传输并不可靠。通过UDP发出的数据包并不能保证安全抵达目的地。但是像网络语音通话之类对数据完整性要求不太高的应用,就可以采用UDP方式。同时语音通话不适合使用重传,之前说的一句话没听到过了一会儿突然蹦出来了算什么……
1. UDP数据传输
下面两段代码分别演示了UDP的数据发送和接收,相比TCP省去了连接部分,代码更加简单。
发送部分:
import socket import time DST_IP = "137.58.230.162"DST_PORT = 8888 #建立Socket,SOCK_DGRAM表示Socket类型为UDPprint("Starting socket: UDP...")socket_udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #向目的地址和端口,发送数据print("Sending package to %s:%d..." %(DST_IP, DST_PORT))dst_addr = (DST_IP, DST_PORT)while True: socket_udp.sendto("Hello UDP!", dst_addr) time.sleep(1) continue接收部分:
import socket import time HOST_IP = "137.58.230.162"HOST_PORT = 8888 #建立Socket,SOCK_DGRAM表示Socket类型为UDPprint("Starting socket: UDP...")socket_udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #绑定本机IP和端口,在此端口上接收数据print("UDP server bind @ %s:%d!" %(HOST_IP, HOST_PORT) )host_addr = (HOST_IP, HOST_PORT)socket_udp.bind(host_addr) #接收数据,同时显示数据的源地址print("Receiving package...")while True: data, (src_addr, src_port) = socket_udp.recvfrom(512) if len(data)>0: print("Received from %s: %s" %(src_addr, data)) time.sleep(1) continue
UDP数据发送
UDP数据接收
2.2. UDP多线程操作
如果想要在一个程序中同时接收和发送数据就要复杂一些了。这里给出了一个多线程操作的例子:在程序的主线程中接收数据,同时新建一个线程来发送数据,发送线程循环执行send_thread()函数中的内容。这里,147.214.210.229为本机的地址,接收端口为7777。目的地址和端口分别为137.58.230.162和8888。
import socket import timeimport thread HOST_IP = "147.214.210.229"HOST_PORT = 7777host_addr = (HOST_IP, HOST_PORT) DST_IP = "137.58.230.162"DST_PORT = 8888dst_addr = (DST_IP, DST_PORT) # UDP 数据发送线程def send_thread(): print("Starting TX socket: UDP...") socket_udp_tx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) while True: socket_udp_tx.sendto("Hello UDP!", dst_addr) time.sleep(1) # UDP 数据接收部分print("Starting TX thread...")thread.start_new_thread(send_thread, ()) print("Starting RX socket: UDP...")socket_udp_rx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) print("UDP server bind @ %s:%d!" %(HOST_IP, HOST_PORT) )socket_udp_rx.bind(host_addr) print("Receiving package...")while True: data, (src_addr, src_port) = socket_udp_rx.recvfrom(512) if len(data)>0: print("Received from %s: %s" %(src_addr, data)) continue该程序可以运行在两个不同的设备上,只要将本机地址和目的地址对调即可。
运行程序,即可看到两台设备互相发送数据的信息:
树莓派上运行的UDP收发程序
PC上运行的UDP收发程序 |
|