python学习道路(day9note)(socketserver编程,ftp)

时间:2022-08-15 00:00:55

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) #发送给客户端需要循环单次长度