python学习道路(day9note)(socketserver编程,ftp)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习道路(day9note)(socketserver编程,ftp)相关的知识,希望对你有一定的参考价值。
1.ftp client
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 5 import socket 6 import subprocess 7 8 user_data = { 9 ‘user‘:None, 10 } 11 12 user_status = False #用户验证,只是当用户可以链接的时候需要去验证一下用户密码 13 def login(): 14 count = 0 15 global user_status 16 while True: 17 user_name = input("请输入您的用户名>>>:") 18 with open(‘D:\\kkk\\day5work\\db.txt‘, ‘r‘,encoding="utf-8") as files: 19 for i in files.readlines(): #整行读取 20 if user_name in i: #空格为分隔符生成字典 21 while True: 22 passwd = input("请输入您的密码>>>:") 23 if str(passwd) == str(i.split(‘ ‘)[-1].strip(‘\n‘)):#上面空格分隔符后面的密码 24 user_data[‘user‘] = user_name 25 #print(user_data[‘user‘]) 调试用的可以删除 26 user_status = True 27 break 28 else: 29 count += 1 30 if count >= 3: 31 print(‘input passwd error‘) 32 exit("您输入过多次错误密码,将被锁定:") #锁定的方法还没有实现上去 33 if user_status == True: 34 break 35 login() 36 if user_status == True: 37 print("1111") 38 39 40 client = socket.socket() 41 client.connect((‘10.10.10.140‘,8002)) #客户端需要链接的Ip 和 端口 42 while True: 43 msg = input(‘>>>:‘).strip() #用户输入想要执行的命令 44 if len(msg) == 0: continue #判断无输入继续 45 print(‘to server‘, msg) 46 client.send(‘put‘) 47 if ‘put‘ in msg: 48 res_obj = subprocess.Popen(‘cat filename‘, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) #本地查看文件长度 49 res = res_obj.stdout.read() # 执行命令的结果 50 client.send(str(len(res)).encode()) # 命令执行结果的长度字符串一下 51 client.send(res) # 发送给客户端需要循环单次长度 52 53 if ‘get‘ in msg: 54 client.send(msg.encode()) #将用户输入的命令编码,只接收二进制文件 55 date = client.recv(1024) #接收的文件字符数 56 print("res:",date.decode()) 57 total_size = int(date.decode()) #将接收的字符串解码并整型 58 recevied_size = 0 #标识 59 res = b‘‘ 60 while recevied_size < total_size: #接收大小与总数相比 61 d = client.recv(1024) 62 res += d 63 old = open("filename.txt", "r+", encoding="utf-8") 64 old.write(d) 65 recevied_size += len(d) #每次循环加上之前获取的大小 66 # print("rece done----") 67 # print(res.decode()) 68 69 if ‘put‘ in msg: 70 client.send(msg.encode()) # 将用户输入的命令编码,只接收二进制文件 71 date = client.recv(1024) # 接收的文件字符数 72 print("res:", date.decode()) 73 total_size = int(date.decode()) # 将接收的字符串解码并整型 74 recevied_size = 0 # 标识 75 res = b‘‘ 76 while recevied_size < total_size: # 接收大小与总数相比 77 d = client.recv(1024) 78 res += d 79 old = open("filename.txt", "r+", encoding="utf-8") 80 old.write(d) 81 recevied_size += len(d) # 每次循环加上之前获取的大小 82 #(家目录应该是字符串的拼接吧)
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) #发送给客户端需要循环单次长度
以上是关于python学习道路(day9note)(socketserver编程,ftp)的主要内容,如果未能解决你的问题,请参考以下文章
python学习道路(day12note)(mysql操作,python链接mysql,redis)
python学习道路(day7note)(subprocess模块,面向对象)