1.从客户端远程连接到服务端,并请求获取服务端的默认路径下文件、目录列表,在终端打印出文件目录列表
客户端代码如下:
import os
import time
def do_list(s):
#接收服务器确认 OK or FALL
data = s.recv(128).decode()
print(data)
if data == 'OK':
while True:
data = s.recv(128).decode()
if data == '##':
break
print(data+'\t',end=' ')
print("")
return
else:
print("文件列表请求失败")
return
服务端通过os.listdir获取目录列表并发送到客户端,FILE_PATH为服务端传送文件的默认路径
服务端代码如下:
import os
import time
def do_list(c,FILE_PATH):
filelist = os.listdir(FILE_PATH)
#服务器确认请求是否可以执行
if filelist == None:
c.send(b"FALL")
c.send(b'OK')
time.sleep(0.1)
for filename in filelist:
if filename[0] != '.': #and os.path.isfile(FILE_PATH + filename):
c.send(filename.encode())
time.sleep(0.1)
c.send(b"##")
print('文件列表发送完毕')
return
2.向服务端发送请求获取想要传送的文件,然后等待循环接收,通过标志位num[0]判断是文件名还是目录名,从而选择是接收文件还是创建目录
客户端代码如下:
def do_get(s,flname):
s.send(('P '+flname).encode())
while True:
file_num=s.recv(128).decode()
num = file_num.split(' ')
list_file = num[1].split('\\')
filename = '/'.join(list_file)
if num[0] == 'f':
f = open(filename,'wb')
while True:
data = s.recv(1024)
if data == b'##':
f.close()
break
f.write(data)
s.send(b"OK")
print("文件:%s 接收完毕" % filename)
elif num[0] == 'd':
os.mkdir(filename)
s.send(b"OK")
elif num[0] == 'b':
break
服务端递归遍历文件目录,根据类型不同(文件、目录)添加不同的标志位,然后发送给客户端
def do_put(c,filename,FILE_PATH):
if os.path.isfile(FILE_PATH+filename):
c.send(("f "+filename).encode())
time.sleep(0.2)
f = open(FILE_PATH+filename,'rb')
while True:
data = f.read(1024)
if not data:
time.sleep(0.1)
c.send(b'##')
break
c.send(data)
print('文件传输结束')
f.close()
if (c.recv(128).decode())=='OK':
print(filename,'传输成功')
else:
print(filename,'传输失败')
else:
c.send(("d "+filename).encode())
if (c.recv(128).decode())=='OK':
print(filename,'传输成功')
else:
print(filename,'传输失败')
filelist = os.listdir(FILE_PATH+filename)
for i in filelist:
print(i)
# do_put(c,filename+'/'+i,FILE_PATH)
do_put(c,filename+'\\'+i,FILE_PATH)
同理也可将文件从客户端传送到服务端。