本帖最后由 懒兔子 于 2015-5-30 15:06 编辑
树莓派 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类型为UDP
- print("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类型为UDP
- print("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 time
- import thread
-
- HOST_IP = "147.214.210.229"
- HOST_PORT = 7777
- host_addr = (HOST_IP, HOST_PORT)
-
- DST_IP = "137.58.230.162"
- DST_PORT = 8888
- dst_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收发程序
|