我目前正在用Python编写一个简单的客户端/服务器UDP文件传输程序。我目前正在尝试实施一些措施来确保总数据传输。虽然我知道UDP并不以可靠性着称,但我必须使用UDP进行传输(我只是为一个更大的项目开发一个测试程序,而且该项目中使用的设备并非如此。能够使用TCP流。)
无论如何,通过实现一个简单的ACK系统,我可以将所有数据传输到客户端,其中客户端为它接收的每个数据包发送一个ACK。然而,这会降低传输速度(不是非常糟糕,但足以让我优化它)。
我降低速度的想法是每隔一段时间(而不是每个数据包)发送一个ACK。应该发送ACK的频率可能取决于接收的数据量(即每x个字节)或接收的数据包(即每x个数据包)。
但是,我在下面的当前系统中努力实现这一点:
服务器:
if(numSent >= 100):
print "Waiting for an ACK now..."
conn.settimeout(2)
try:
ACK = conn.recv(tcp_buf)
print "ACK: " + ACK
ackF.write(ACK+"\n")
except socket.timeout:
isClientCaughtUp = False
conn.settimeout(None)
if (isClientCaughtUp is False):
if(s.sendto(chunk,addr) and s.sendto(str(local_ID),addr)):
ACK = conn.recv(tcp_buf)
ackF.write(ACK + "\n")
if (ACK):
isClientCaughtUp = True
conn.settimeout(2)
break
numSent = 0
客户端:
try:
while(dataChunk):
actualNumChunks += 1
count += 1
f.write(dataChunk)
sock.settimeout(6)
dataChunk, addr = sock.recvfrom(buf)
packID, junkAddr = sock.recvfrom(buf)
if(count >= 100):
#print "ACK sent!"
tcp_sock.send("1")
count = 0
except socket.timeout:
f.close()
sock.close()
现在,我相信我的套接字超时有问题。服务器不发送所有数据包,也不接收任何确认。这是对原始代码的一个非常小的修改,让我为发送的每个数据包发送/接收ACK。此外,我现在只发送垃圾ACK。
此外,该程序通过TCP进行通信(ACK和其他一些东西),而数据本身则通过UDP发送。它们是两个不同的插座。