【问题标题】:Receiver loses the same last bytes of file lost sent via TCP socket in python接收器丢失了通过 python 中的 TCP 套接字发送的相同文件丢失的最后一个字节
【发布时间】:2014-06-13 07:16:29
【问题描述】:

我使用以下代码(python)通过 TCP 从客户端向服务器发送一个 .txt 文件(大约 87 kbyte 大小):

客户:

                        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 KB。 有没有人有什么建议?

【问题讨论】:

  • 到底缺少什么?不是读写文件,而是在发送方生成模式并在接收方验证模式。另外,您使用的是哪个 Python 版本?
  • 1045 是从哪里来的?
  • Python 是 2.7.x 的最后一个版本
  • 1045 是 python 中 1024 个字符的字节大小
  • .txt 文件的最后一个字不见了。

标签: python sockets tcp


【解决方案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()

【讨论】:

    【解决方案2】:

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

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

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

    更多讨论请见Difference between message-oriented protocols and stream-oriented protocols

    【讨论】:

    • 我将:data = c.recv(1045) 替换为:buff='' while len(buff)
    猜你喜欢
    • 1970-01-01
    • 2015-04-11
    • 2020-01-12
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多