使用套接字 TCP 下载 python 中的文件
Downloading a file in python using sockets TCP
我正在编写一个接受下载命令的 TCP 并发(基于进程的并发)服务器。客户端应该从服务器下载一个文件,截至目前,为了测试我的下载算法,我已经硬编码了要下载的文件名。
我查找了示例 download algorithm 并正在使用该代码中使用的 while 循环。
我认为我的问题是其中一个 while 循环(或者可能是两个循环)挂起并且不会结束。 我认为是客户端,很有可能在等待更多的文件内容。
服务器
file = open('download.txt','rb+')
print "Opened File: " , file.name
fileContent = file.read(1)
clientsocket.send(fileContent)
while (fileContent):
print "iteration", fileContent
clientsocket.send(fileContent)
fileContent = file.read(1)
file.close()
客户端
print "Attempting download..."
f = open('downloaded.txt' , 'wb+')
print "Opened File: " , f.name
fileContent = s.recv(1)
while (fileContent):
print "iteration", fileContent
f.write(fileContent)
fileContent = s.recv(1)
print "Download Complete"
f.close()
我在没有 while 循环的情况下完成了文件传输,使用
f.open(file)
fContent = f.read(1024)
client.send(fContent)
f.close
f.open(file)
fContent = server.recv(1024)
f.write(fContent)
f.close
但我知道如果文件大于缓冲区大小,这会导致问题。
这是一个并发服务器,它使用单独的进程来处理每个连接。 (我认为这不会影响我当前的问题,但我是并发的新手,我想我会提到它。)
有谁知道为什么我的 while 循环没有结束?或者有人知道我可能做错了什么吗?提前致谢!
编辑:
我的输出:
cli
Attempting download...
Opened File: downloaded.txt
iteration t
iteration h
iteration i
iteration s
iteration
iteration i
iteration s
iteration
iteration a
iteration
iteration f
iteration i
iteration l
iteration e
iteration
服务
Recived dl from: ('127.0.0.1', 38161) | 2015-12-06 13:07:12.835998
Opened File: download.txt
iteration t
iteration h
iteration i
iteration s
iteration
iteration i
iteration s
iteration
iteration a
iteration
iteration f
iteration i
iteration l
iteration e
iteration
客户端卡住了,我必须ctrl z 出来。服务器将继续接受连接。我刚刚意识到我可以在服务器的 while 循环之后添加一个简单的打印语句来检查服务器的 while 循环是否完成。
第二次编辑:
服务器没有挂起(循环后成功显示消息)。这让我相信客户端正在调用 recv() 并等待更多文件内容。
第三次编辑:
出于测试目的,read/write 缓冲区仅为 1。
逐字节发送文件可能会很慢。最佳使用 shutil.copyfileobj
,为您处理转账:
def send_file(socket, filename):
with open('download.txt','rb') as inp:
print "Opened File: " , file.name
out = socket.makefile('wb')
shutil.copyfileobj(inp, out)
def recv_file(socket, filename):
with open('download.txt','wb') as out:
print "Opened File: " , file.name
inp = socket.makefile('rb')
shutil.copyfileobj(inp, out)
我正在编写一个接受下载命令的 TCP 并发(基于进程的并发)服务器。客户端应该从服务器下载一个文件,截至目前,为了测试我的下载算法,我已经硬编码了要下载的文件名。
我查找了示例 download algorithm 并正在使用该代码中使用的 while 循环。
我认为我的问题是其中一个 while 循环(或者可能是两个循环)挂起并且不会结束。 我认为是客户端,很有可能在等待更多的文件内容。
服务器
file = open('download.txt','rb+')
print "Opened File: " , file.name
fileContent = file.read(1)
clientsocket.send(fileContent)
while (fileContent):
print "iteration", fileContent
clientsocket.send(fileContent)
fileContent = file.read(1)
file.close()
客户端
print "Attempting download..."
f = open('downloaded.txt' , 'wb+')
print "Opened File: " , f.name
fileContent = s.recv(1)
while (fileContent):
print "iteration", fileContent
f.write(fileContent)
fileContent = s.recv(1)
print "Download Complete"
f.close()
我在没有 while 循环的情况下完成了文件传输,使用
f.open(file)
fContent = f.read(1024)
client.send(fContent)
f.close
f.open(file)
fContent = server.recv(1024)
f.write(fContent)
f.close
但我知道如果文件大于缓冲区大小,这会导致问题。
这是一个并发服务器,它使用单独的进程来处理每个连接。 (我认为这不会影响我当前的问题,但我是并发的新手,我想我会提到它。)
有谁知道为什么我的 while 循环没有结束?或者有人知道我可能做错了什么吗?提前致谢!
编辑:
我的输出:
cli
Attempting download...
Opened File: downloaded.txt
iteration t
iteration h
iteration i
iteration s
iteration
iteration i
iteration s
iteration
iteration a
iteration
iteration f
iteration i
iteration l
iteration e
iteration
服务
Recived dl from: ('127.0.0.1', 38161) | 2015-12-06 13:07:12.835998
Opened File: download.txt
iteration t
iteration h
iteration i
iteration s
iteration
iteration i
iteration s
iteration
iteration a
iteration
iteration f
iteration i
iteration l
iteration e
iteration
客户端卡住了,我必须ctrl z 出来。服务器将继续接受连接。我刚刚意识到我可以在服务器的 while 循环之后添加一个简单的打印语句来检查服务器的 while 循环是否完成。
第二次编辑:
服务器没有挂起(循环后成功显示消息)。这让我相信客户端正在调用 recv() 并等待更多文件内容。
第三次编辑:
出于测试目的,read/write 缓冲区仅为 1。
逐字节发送文件可能会很慢。最佳使用 shutil.copyfileobj
,为您处理转账:
def send_file(socket, filename):
with open('download.txt','rb') as inp:
print "Opened File: " , file.name
out = socket.makefile('wb')
shutil.copyfileobj(inp, out)
def recv_file(socket, filename):
with open('download.txt','wb') as out:
print "Opened File: " , file.name
inp = socket.makefile('rb')
shutil.copyfileobj(inp, out)