查看: 4003|回复: 2

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

[复制链接]
  • TA的每日心情
    无聊
    2015-8-17 09:38
  • 签到天数: 361 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-3-18 17:08:05 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 懒兔子 于 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收发程序


    回复

    使用道具 举报

  • TA的每日心情

    2021-12-7 12:35
  • 签到天数: 1354 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-3-18 23:32:52 | 显示全部楼层
    学习和参考了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-11-24 09:41
  • 签到天数: 549 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2015-4-3 12:30:47 | 显示全部楼层
    good   job   
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-24 03:14 , Processed in 0.129193 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.