接收器丢失了在python中通过TCP套接字发送的文件丢失的相同最后字节

时间:2014-06-12 17:49:16

标签: python sockets tcp

我使用以下代码(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千字节。 有没有人建议做什么?

2 个答案:

答案 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