【发布时间】:2013-02-07 19:41:51
【问题描述】:
我正在尝试在 python 中编写一个程序来通过套接字传输文件夹中的多个文件,到目前为止我有以下代码
客户:
def uploadFiles(folder,dcip,PORT,filetype):
os.chdir(folder)
dirList = os.listdir(folder)
print dirList
ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print PORT
ms.connect((dcip, int(PORT)))
for fname in dirList:
if fname.endswith(str(filetype)):
cmd = 'get\n%s\n' % (fname)
ms.sendall(cmd)
f = open(fname,'rb')
data = f.read()
f.close()
print data
r = ms.recv(2)
ms.sendall(data)
ms.sendall('done\n%s\n' %(fname))
ms.sendall('end\n\n')
ms.close()
服务器:
import socket,os
listener_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listener_socket.bind(('',33234))
filename = ''
while 1:
listener_socket.listen(100)
connection,address_client = listener_socket.accept()
if not os.path.exists(str(address_client[0])):
os.makedirs(str(address_client[0]))
currdir = os.getcwd()
os.chdir('./'+str(address_client[0]))
while(1):
data = connection.recv(4096)
cmd = data[:data.find('\n')]
if cmd == 'get':
x,filename,x = data.split('\n',2)
connection.sendall('ok')
f = open(filename,'wb')
if cmd == 'done':
continue
f.write(data)
if cmd == 'end':
connection.close()
break
os.chdir(currdir)
上面的代码进入了一个无限循环,我明白这是因为if cmd == 'done' 部分中的 continue 语句,我想知道它为什么会这样做?我的意思是它永远不会从客户端收到 done 消息,有人可以帮我修复代码吗?
【问题讨论】:
-
您的循环将在“结束”消息而不是“完成”消息处终止。
-
我在传输完所有文件后发送结束消息。此外,它不会按原样复制文件,它会针对第一个文件本身进行循环。
-
由于读取是分块完成的,因此只有第一个命令将位于块的开头。其他命令(get、done、end)将位于同一块或下一个块内的某个位置。应该对接收到的数据进行更智能的解析。
标签: python file-transfer tcpsocket