【问题标题】:Flaw in transferring file through tcp通过tcp传输文件的缺陷
【发布时间】:2015-11-19 03:49:41
【问题描述】:

服务器端代码。打开一个文件,读取文件的一部分,发送该位,直到完成

f = open("{}".format(filename), "rb")
l = f.read(1024)
while (l):
    print("Sending...")
    client.send(l)
    l = f.read(1024)
print("Finished sending")   
f.close()
client.shutdown(socket.SHUT_WR)
client.close()

客户端代码,创建文件接收一点,将其写入文件直到完成。

f = open("{}".format(filename), "ab+")
l = client.recv(1024)
while (l):
    print("Receiving...")
    f.write(l)
    l = client.recv(1024)
f.close()
print("Transmission completed")
  1. 我知道我必须使用socket.shutdown(socket.SHUT_WR) 通知接收者文件已完成,但不允许进一步发送。有没有办法绕过它?也许使用另一个命令,如.shutdown()?我需要保持连接以便进一步发送/接收。
  2. 在处理复杂文件时,不知何故,我收到的信息超出了我的预期。我确信客户端会将不相关的先前数据写入文件,并通过client.recv(1024) 接收。有没有办法在文件数据到达之前“扔掉”或安全清空数据?

.jpg 文件:https://i.stack.imgur.com/kjXBZ.png

.txt 文件:https://i.imgur.com/fVNfx2R.png

【问题讨论】:

  • 可能是因为选项“ab+”。 “а”用于追加,而不是用于创建新的清晰文件并将其写入为“w”
  • 说代码是对的。您应该使用'wb'(w 表示写入,b 表示二进制模式)。
  • 很高兴使用shutdown。但是对于真正的graceful shutdown,服务器程序应该尝试从套接字读取,直到客户端(接收方)关闭连接。
  • 您不必关机...先发送文件的大小,然后发送文件。准确读取大小指示的字节数。然后你可以发送另一个文件。 This answer 有一个例子。

标签: python windows shell sockets python-3.x


【解决方案1】:

我可以看到这个问题背后的两个意图。一、学东西;其次,实现一些很酷且有效的东西(有用)。学习过程的一部分是通过阅读文档获得被动知识——这是针对opening the file,并使用with 构造。

但是,学习的一部分也是学习更大的图景,并学习其他人(更有能力)如何解决问题。这可以通过阅读现有解决方案的源代码并尝试理解代码来完成。

我建议获取paramiko模块(https://github.com/paramiko/paramiko.git),并学习sftp_client.pysftp_server.pydemos/

的确,它比您尝试的几行要复杂得多,但是您可能会学到很多东西,并且有关如何使用 paramiko 的知识将来可能对您很有价值。此外,您会发现更多需要重点学习的问题。 ;)

【讨论】:

    猜你喜欢
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2012-07-12
    • 2011-06-26
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多