【发布时间】:2020-08-13 05:43:50
【问题描述】:
我现在正在使用 python3 开发 p2p 文件共享系统,但遇到了一个我不知道如何解决的问题。
我有一个服务器进程和一个客户端进程,其中一个客户端进程连接到其他节点,将其放入自己的线程中,并通过套接字侦听数据。当仅从一个其他对等方下载时,文件可以正确写入,没有问题,但是当它被拆分到多个对等方时,文件已损坏。数据是从其他对等方正确接收的,所以我认为这将是文件写入问题。
当我从对等端获取数据时,我打开文件,寻找数据的来源位置,然后写入并关闭文件。锁能解决这个问题吗?
这是在它自己的线程中不断监听的代码
def handleResponse(clientConnection, fileName, fileSize):
# Listen for connections forever
try:
while True:
#fileName = ""
startPos = 0
data = clientConnection.recv(2154)
# If a response, process it
if (len(data) > 0):
split = data.split(b"\r\n\r\n")
#print(split[0])
headers = split[0].replace(b'\r\n', b' ').split(b' ')
# Go through the split headers and grab the startPos and fileName
for i in range(len(headers)):
if (headers[i] == b"Range:"):
startPos = int(headers[i+1])
#fileName = headers[i+2].decode()
break
# Write the file at the seek pos
mode = "ab+"
if (startPos == 0):
mode = "wb+"
with open ("Download/" + fileName, mode) as f:
f.seek(startPos, 0)
f.write(split[1])
f.close()
【问题讨论】:
-
为什么要以追加模式打开文件?来自the documentation of open: "... 'a' 用于追加(在某些 Unix 系统上,这意味着 所有写入都追加到文件末尾,而不管当前的查找位置如何)。 ..”.
-
我不知道(在 MacOS 上)。这是在多个线程乱序写入数据的情况下破坏我的文件的原因吗?如果是这样的话,那将是有道理的。
-
无论是否并发访问,我实际上都没有理由首先使用 append 打开文件。你应该打开写作(而不是追加),你只是寻找你想要的位置,不管位置是什么。
-
是的,因为 w 会覆盖文件(如果存在),我将不得不读取文件的初始内容,将数据插入正确的位置,然后写入整个块。如果我走错了方向,请纠正我,但我认为我走在正确的轨道上。谢谢!
-
其实 r+ 可以做我需要的,我只需要在写入之前创建文件,否则它会失败。感谢您的帮助!
标签: python python-3.x sockets io