1.ftp client
#!/usr/bin/env python #_*_coding:utf-8_*_ import socket import subprocess user_data = { 'user':None, } user_status = False #用户验证,只是当用户可以链接的时候需要去验证一下用户密码 def login(): count = 0 global user_status while True: user_name = input("请输入您的用户名>>>:") with open('D:\\kkk\\day5work\\db.txt', 'r',encoding="utf-8") as files: for i in files.readlines(): #整行读取 if user_name in i: #空格为分隔符生成字典 while True: passwd = input("请输入您的密码>>>:") if str(passwd) == str(i.split(' ')[-1].strip('\n')):#上面空格分隔符后面的密码 user_data['user'] = user_name #print(user_data['user']) 调试用的可以删除 user_status = True break else: count += 1 if count >= 3: print('input passwd error') exit("您输入过多次错误密码,将被锁定:") #锁定的方法还没有实现上去 if user_status == True: break login() if user_status == True: ") client = socket.socket() client.connect(('10.10.10.140',8002)) #客户端需要链接的Ip 和 端口 while True: msg = input('>>>:').strip() #用户输入想要执行的命令 if len(msg) == 0: continue #判断无输入继续 print('to server', msg) client.send('put') if 'put' in msg: res_obj = subprocess.Popen('cat filename', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) #本地查看文件长度 res = res_obj.stdout.read() # 执行命令的结果 client.send(str(len(res)).encode()) # 命令执行结果的长度字符串一下 client.send(res) # 发送给客户端需要循环单次长度 if 'get' in msg: client.send(msg.encode()) #将用户输入的命令编码,只接收二进制文件 date = client.recv(1024) #接收的文件字符数 print("res:",date.decode()) total_size = int(date.decode()) #将接收的字符串解码并整型 recevied_size = 0 #标识 res = b'' while recevied_size < total_size: #接收大小与总数相比 d = client.recv(1024) res += d old = open("filename.txt", "r+", encoding="utf-8") old.write(d) recevied_size += len(d) #每次循环加上之前获取的大小 # print("rece done----") # print(res.decode()) if 'put' in msg: client.send(msg.encode()) # 将用户输入的命令编码,只接收二进制文件 date = client.recv(1024) # 接收的文件字符数 print("res:", date.decode()) total_size = int(date.decode()) # 将接收的字符串解码并整型 recevied_size = 0 # 标识 res = b'' while recevied_size < total_size: # 接收大小与总数相比 d = client.recv(1024) res += d old = open("filename.txt", "r+", encoding="utf-8") old.write(d) recevied_size += len(d) # 每次循环加上之前获取的大小 #(家目录应该是字符串的拼接吧)
2.ftp server
#!/usr/bin/env python #_*_coding:utf-8_*_ import socket import subprocess server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建实例 server.bind(("0.0.0.0",8002)) #监听所有IP,端口 server.listen(5) #排列监听主机数,不是并发 print("--------listen-----------") while True: conn,client_addr = server.accept() #接受客户端的链接 while True: date = conn.recv(1024) # 接收客户端发过来的字符串的长度 if 'put' in date: total_size = int(date.decode()) # 将接收的字符串解码并整型 recevied_size = 0 # 标识 res = b'' while recevied_size < total_size: # 接收大小与总数相比 d = conn.recv(1024) old = open("filename.txt", "r+", encoding="utf-8") old.write(d) res += d recevied_size += len(d) # 每次循环加上之前获取的大小 print("rece done----") if 'get' in date: res_obj = subprocess.Popen('cat filename',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) #在本机实行的命令 res = res_obj.stdout.read() #执行命令的结果 conn.send(str(len(res)).encode()) #命令执行结果的长度字符串一下 conn.send(res) #发送给客户端需要循环单次长度