接收器丢失通过Python TCP套接字发送的文件最后几字节
我用下面的代码(python)通过TCP把一个大约87千字节的.txt文件从客户端发送到服务器:
客户端:
f = open(filename, 'r')
while 1:
data = f.read(1024)
if not data:
data='*Endoffile*!'
con.send('%1024s' %data)
f.close()
break
else:
con.send('%1024s' %data)
服务器:
f = open(filename,'w')
while 1:
data = c.recv(1045)
if data=='%1024s' %'*Endoffile*!':
f.close()
break
else:
f.write(data)
问题是,接收到的文件总是在同一个地方被截断(我打开时总是停在同一个词),比完整文件小了大约1.6千字节。有没有人有什么建议该怎么做?
2 个回答
0
简单来说,文件结束的检查出了问题,所以服务器一直在循环里,根本无法跳出来。文件没有被关闭,最近写入的数据也没有被保存到磁盘上,导致文件变得不完整。
造成这个文件结束检查出错的原因是,TCP是一种面向流的协议,它不保留消息的边界。换句话说,一个 recv()
操作并不一定对应一个 send()
操作。
而你的代码则期望在一次完整的 recv()
中接收到 '%1024s' %'*Endoffile*!'
。
想了解更多,可以查看 面向消息的协议和面向流的协议之间的区别
2
通过对服务器端代码的这些修改,问题得到了解决:
while 1:
f = open(filename,'wb')
data=c.recv(1024)
while ('*Endoffile*!' in data) == False:
f.write(data)
data=c.recv(1024)
print data
data=data.replace('*Endoffile*!', '')
f.write(data)
f.close()