【发布时间】: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")
- 我知道我必须使用
socket.shutdown(socket.SHUT_WR)通知接收者文件已完成,但不允许进一步发送。有没有办法绕过它?也许使用另一个命令,如.shutdown()?我需要保持连接以便进一步发送/接收。 - 在处理复杂文件时,不知何故,我收到的信息超出了我的预期。我确信客户端会将不相关的先前数据写入文件,并通过
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