接收器丢失通过Python TCP套接字发送的文件最后几字节

1 投票
2 回答
744 浏览
提问于 2025-04-18 09:35

我用下面的代码(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()

撰写回答