Skip to main content
 首页 » 编程设计

Python UDP 服务器发送文本文件的行

2025年05月04日24shanyou

我需要模拟一个 UDP 服务器,它在无限循环中逐行发送文本文件的内容。我写了下面的代码,但在另一端我没有收到任何东西(另一端是 Qt 代码,我确信它可以工作):

import socket 
import time 
 
# setup UDP socket 
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sa = ('localhost', 9763) 
sock.bind(sa) 
 
filename = '/home/saeid/Documents/data.txt'  # file to read 
numlines = sum(1 for line in open(filename))  # get number of lines in file 
 
 
# get line of a file 
def get_line(line): 
    with open(filename) as fp: 
        for i, l in enumerate(fp): 
            if i == line: 
                return l 
 
# main loop 
while True: 
    currline = 0 
    while currline < numlines: 
        sock.sendto(get_line(currline), sa) 
        currline += 1 
        time.sleep(1) 

我不是 python 专业人士,无法找出问题:(

请您参考如下方法:

对于初学者来说,这是一团糟:

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sa = ('localhost', 9763) 
sock.bind(sa) 
... 
sock.sendto(get_line(currline), sa) 

通过绑定(bind),您基本上是在说“我想在那个主机/端口上收听”。但是随后您将数据发送到同一主机/端口。我假设还有其他一些目的地地址,例如sock.sendto(get_line(currline), ('my_host', 1234))。顺便说一句,你为什么要绑定(bind)地址? sock.bind(sa) 行是不必要的,删除它。


另一件事是您的文件读取代码效率极低且难以阅读(我花了一段时间才明白这是怎么回事)。尝试这样的事情:

with open(filename, 'r') as fo: 
    while True: 
        for line in fo: 
            sock.sendto(line, DEST_ADDRESS) 
            time.sleep(1) 
        fo.seek(0)  # go back to the begining of the file and repeat 

并去掉 get_line 函数。

至少这是我在阅读您的描述后得出的结论。如果您不想无限地发送同一个文件,那么您可以摆脱 while True: 循环和 fo.seek(0) 调用。