2回答

0收藏

【懒兔子玩树莓】Python UDP编程

#开源分享 #开源分享 4437 人阅读 | 2 人回复 | 2015-03-18

本帖最后由 懒兔子 于 2015-5-30 15:06 编辑

树莓派 Python UDP编程

UDP是TCP之外的另一重要协议,由于没有连接和应答机制,UDP传输并不可靠。通过UDP发出的数据包并不能保证安全抵达目的地。但是像网络语音通话之类对数据完整性要求不太高的应用,就可以采用UDP方式。同时语音通话不适合使用重传,之前说的一句话没听到过了一会儿突然蹦出来了算什么……


1. UDP数据传输

下面两段代码分别演示了UDP的数据发送和接收,相比TCP省去了连接部分,代码更加简单。


发送部分:

  1. import socket   
  2. import time

  3. DST_IP = "137.58.230.162"
  4. DST_PORT = 8888

  5. #建立Socket,SOCK_DGRAM表示Socket类型为UDP
  6. print("Starting socket: UDP...")
  7. socket_udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

  8. #向目的地址和端口,发送数据
  9. print("Sending package to %s:%d..." %(DST_IP, DST_PORT))
  10. dst_addr = (DST_IP, DST_PORT)
  11. while True:
  12.         socket_udp.sendto("Hello UDP!", dst_addr)
  13.         time.sleep(1)
  14.         continue
复制代码

接收部分:

  1. import socket   
  2. import time
  3.    
  4. HOST_IP = "137.58.230.162"
  5. HOST_PORT = 8888

  6. #建立Socket,SOCK_DGRAM表示Socket类型为UDP
  7. print("Starting socket: UDP...")
  8. socket_udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

  9. #绑定本机IP和端口,在此端口上接收数据
  10. print("UDP server bind @ %s:%d!" %(HOST_IP, HOST_PORT) )
  11. host_addr = (HOST_IP, HOST_PORT)
  12. socket_udp.bind(host_addr)

  13. #接收数据,同时显示数据的源地址
  14. print("Receiving package...")
  15. while True:
  16.     data, (src_addr, src_port) = socket_udp.recvfrom(512)  
  17.     if len(data)>0:
  18.         print("Received from %s: %s" %(src_addr, data))
  19.         time.sleep(1)
  20.         continue
复制代码

UDP数据发送


UDP数据接收


2.2. UDP多线程操作

如果想要在一个程序中同时接收和发送数据就要复杂一些了。这里给出了一个多线程操作的例子:在程序的主线程中接收数据,同时新建一个线程来发送数据,发送线程循环执行send_thread()函数中的内容。这里,147.214.210.229为本机的地址,接收端口为7777。目的地址和端口分别为137.58.230.162和8888。

  1. import socket   
  2. import time
  3. import thread

  4. HOST_IP = "147.214.210.229"
  5. HOST_PORT = 7777
  6. host_addr = (HOST_IP, HOST_PORT)

  7. DST_IP = "137.58.230.162"
  8. DST_PORT = 8888
  9. dst_addr = (DST_IP, DST_PORT)

  10. # UDP 数据发送线程
  11. def send_thread():
  12.     print("Starting TX socket: UDP...")
  13.     socket_udp_tx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

  14.     while True:
  15.         socket_udp_tx.sendto("Hello UDP!", dst_addr)
  16.         time.sleep(1)

  17.    
  18. # UDP 数据接收部分
  19. print("Starting TX thread...")
  20. thread.start_new_thread(send_thread, ())

  21. print("Starting RX socket: UDP...")
  22. socket_udp_rx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

  23. print("UDP server bind @ %s:%d!" %(HOST_IP, HOST_PORT) )
  24. socket_udp_rx.bind(host_addr)

  25. print("Receiving package...")
  26. while True:
  27.     data, (src_addr, src_port) = socket_udp_rx.recvfrom(512)  
  28.     if len(data)>0:
  29.         print("Received from %s: %s" %(src_addr, data))
  30.         continue
复制代码

该程序可以运行在两个不同的设备上,只要将本机地址和目的地址对调即可。

运行程序,即可看到两台设备互相发送数据的信息:


树莓派上运行的UDP收发程序


PC上运行的UDP收发程序


一只搞电子的懒兔子~~
分享到:
回复

使用道具 举报

回答|共 2 个

倒序浏览

沙发

jwdxu2009

发表于 2015-3-18 23:32:52 | 只看该作者

学习和参考了
板凳

cnc2020

发表于 2015-4-3 12:30:47 | 只看该作者

good   job   
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条