Skip to main content
 首页 » 编程设计

python之UDP 服务器帧间隙

2025年05月04日8daizhj

我是 python 的新手,想在这里获得一些帮助。我写了一个代码来通过套接字传输 UDP 数据。我想每 50 微秒循环重新传输一次数据,但我只能每 3 秒发送一次!我确定我做错了什么,你能帮帮我吗?我粘贴了下面的代码:

import socket,codecs,binascii,re ,sched, time 
 
UDP_IP = "XXX.XXX.XXX.XXX" 
 
UDP_PORT = 30001 
MESSAGE =  '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\ 
x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20'# !"#$%' #"\x00\x01\x02 " 
 
 
s = sched.scheduler(time.time, time.sleep)     
 
def send_data(sc): 
 
    sock = socket.socket(socket.AF_INET, # Internet 
 
                     socket.SOCK_DGRAM) # UDP 
 
    sock.sendto(MESSAGE, (UDP_IP, UDP_PORT)) 
 
 
 
    print"" 
    print"" 
    print"" 
    print"" 
    print""     
    sc.enter(0.000050, 1, send_data, (sc,))  
    print time.time() 
    print"" 
    print"" 
 
s.enter(0.0000050, 1, send_data, (s,))     
s.run()     

请您参考如下方法:

首先,每次发送数据时都创建一个新套接字会产生相当大的开销。一遍又一遍地安排一个新任务也会增加很多开销,进一步减慢你的程序。打印命令会增加一些开销,尤其是当您输出大量数据时。

其他需要考虑的事情包括所涉及的系统计时器的精度、与硬件的交互、python 是一种解释性语言等,但相比之下它们都是次要的,因此您可以忽略这些。如果你想写一些实时关键的东西,C 会是更好的选择。

所以无论如何,为了加快你的程序,我会去掉耗时的部分:

import socket, time 
# ... 
def send_data(): 
    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
    while True: #TODO: would require an abort condition 
        sock.sendto(MESSAGE, (UDP_IP, UDP_PORT)) 
        time.sleep(0.00005) # don't count on this to be 100% accurate 

如果你不想让你的主程序阻塞,你可以把它放到一个线程中:

from threading import Thread 
t = Thread(target=send_data) 
t.start()