我使用以下代码(python)从客户端向服务器发送.txt文件(大小约为87 KB):
客户端:
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千字节。 有没有人建议做什么?
答案 0 :(得分:1)
解决了 :
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()
答案 1 :(得分:0)
基本上,文件结束检查已中断,因此服务器永远不会中断循环。该文件永远不会关闭,最近写入的数据不会刷新到磁盘,从而导致文件被截断。
EOF检查被破坏的原因是TCP是面向流的协议,并不保留消息边界。换句话说,单个recv()
不会映射到单个send()
。
另一方面,您的代码希望在一个完整的'%1024s' %'*Endoffile*!'
中收到recv()
。
有关进一步的讨论,请参阅Difference between message-oriented protocols and stream-oriented protocols