查看: 1155|回复: 0

Python UDP编程

[复制链接]
  • TA的每日心情
    慵懒
    2015-8-11 09:37
  • 签到天数: 12 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2015-8-6 21:40:31 | 显示全部楼层 |阅读模式
    分享到:
    文章经过作者同意并委托转载
    地址:文章地址
    树莓派 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收发程序
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-5-8 22:23 , Processed in 0.124518 second(s), 18 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.