我需要模拟一个 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) 调用。
