2014-06-12 20 views
0

我从客户机发送一个.txt文件(约87千字节的大小)到服务器通过TCP用下面的代码(蟒):接收机丢失文件的相同的最后字节丢失经由TCP套接字发送在python

客户:

     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

究竟缺什么?而不是读取和写入文件,在发送端生成一个模式,并在接收端验证模式。另外,你使用的是什么Python版本? –

+0

'1045'从哪里来? – NPE

+0

Python是2.7.x的最后一个版本 – user1969182

回答

0

基本上,文件结束检查被破坏,所以服务器永远不会跳出循环。该文件永远不会关闭,并且最近写入的数据不会刷新到磁盘,从而导致截断的文件。

EOF检查被破坏的原因是TCP是面向流的协议,并不保留消息边界。换句话说,单个recv()不映射到单个send()

另一方面,您的代码预计在一个完整recv()中收到'%1024s' %'*Endoffile*!'

如需进一步讨论,请参见Difference between message-oriented protocols and stream-oriented protocols

+0

我取代: 数据= c.recv(1045) 用: 抛光轮= '' 而LEN(BUFF)<1045: 抛光轮+ = c.recv(1045 - LEN(浅黄色)) 数据= buff 它发生的情况完全相同 – user1969182

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()