Python_FTP通讯软件

ftpServer.py

 1 import socket
 2 import threading
 3 import os
 4 import struct
 5 
 6 #用户账号、密码、主目录
 7 #也可以把这些信息存放到数据库中
 8 users = {'zhangsan':{'pwd':'zhangsan1234', 'home':r'c:python 3.5'},
 9          'lisi':{'pwd':'lisi567', 'home':'c:\'}}
10 
11 def server(conn,addr, home):
12     print('新客户端:'+str(addr))
13     #进入当前用户主目录
14     os.chdir(home)
15     while True:
16         data = conn.recv(100).decode().lower()
17         #显示客户端输入的每一条命令
18         print(data)
19         #客户端退出
20         if data in ('quit', 'q'):
21             break
22         #查看当前文件夹的文件列表
23         elif data in ('list', 'ls', 'dir'):
24             files = str(os.listdir(os.getcwd()))
25             files = files.encode()
26             conn.send(struct.pack('I', len(files)))
27             conn.send(files)
28         #切换至上一级目录
29         elif ''.join(data.split()) == 'cd..':
30             cwd = os.getcwd()
31             newCwd = cwd[:cwd.rindex('\')]
32             #考虑根目录的情况
33             if newCwd[-1] == ':':
34                 newCwd += '\'
35             #限定用户主目录
36             if newCwd.lower().startswith(home):
37                 os.chdir(newCwd)
38                 conn.send(b'ok')
39             else:
40                 conn.send(b'error')
41         #查看当前目录
42         elif data in ('cwd', 'cd'):
43             conn.send(str(os.getcwd()).encode())
44         elif data.startswith('cd '):
45             #指定最大分隔次数,考虑目标文件夹带有空格的情况
46             #只允许使用相对路径进行跳转
47             data = data.split(maxsplit=1)
48             if len(data) == 2 and  os.path.isdir(data[1]) 
49                and data[1]!=os.path.abspath(data[1]):
50                 os.chdir(data[1])
51                 conn.send(b'ok')
52             else:
53                 conn.send(b'error')
54         #下载文件
55         elif data.startswith('get '):
56             data = data.split(maxsplit=1)
57             #检查文件是否存在
58             if len(data) == 2 and os.path.isfile(data[1]):
59                 conn.send(b'ok')
60                 fp = open(data[1], 'rb')
61                 while True:
62                     content = fp.read(4096)
63                     #发送文件结束
64                     if not content:
65                         conn.send(b'overxxxx')
66                         break
67                     #发送文件内容
68                     conn.send(content)
69                     if conn.recv(10) == b'ok':
70                         continue
71                 fp.close()
72             else:
73                 conn.send(b'no')
74         #无效命令
75         else:
76             pass
77             
78     conn.close()
79     print(str(addr)+'关闭连接')
80 
81 #创建Socket,监听本地端口,等待客户端连接
82 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
83 sock.bind(('', 10600))
84 sock.listen(5)
85 while True:
86     conn, addr = sock.accept()
87     #验证客户端输入的用户名和密码是否正确
88     userId, userPwd = conn.recv(1024).decode().split(',')
89     if userId in users and users[userId]['pwd'] == userPwd:
90         conn.send(b'ok')
91         #为每个客户端连接创建并启动一个线程,参数为连接、客户端地址、客户主目录
92         home = users[userId]['home']
93         t = threading.Thread(target=server, args=(conn,addr,home))
94         t.daemon = True
95         t.start()
96     else:
97         conn.send(b'error')

ftpClient.py

 1 import socket
 2 import threading
 3 import os
 4 import struct
 5 
 6 #用户账号、密码、主目录
 7 #也可以把这些信息存放到数据库中
 8 users = {'zhangsan':{'pwd':'zhangsan1234', 'home':r'c:python 3.5'},
 9          'lisi':{'pwd':'lisi567', 'home':'c:\'}}
10 
11 def server(conn,addr, home):
12     print('新客户端:'+str(addr))
13     #进入当前用户主目录
14     os.chdir(home)
15     while True:
16         data = conn.recv(100).decode().lower()
17         #显示客户端输入的每一条命令
18         print(data)
19         #客户端退出
20         if data in ('quit', 'q'):
21             break
22         #查看当前文件夹的文件列表
23         elif data in ('list', 'ls', 'dir'):
24             files = str(os.listdir(os.getcwd()))
25             files = files.encode()
26             conn.send(struct.pack('I', len(files)))
27             conn.send(files)
28         #切换至上一级目录
29         elif ''.join(data.split()) == 'cd..':
30             cwd = os.getcwd()
31             newCwd = cwd[:cwd.rindex('\')]
32             #考虑根目录的情况
33             if newCwd[-1] == ':':
34                 newCwd += '\'
35             #限定用户主目录
36             if newCwd.lower().startswith(home):
37                 os.chdir(newCwd)
38                 conn.send(b'ok')
39             else:
40                 conn.send(b'error')
41         #查看当前目录
42         elif data in ('cwd', 'cd'):
43             conn.send(str(os.getcwd()).encode())
44         elif data.startswith('cd '):
45             #指定最大分隔次数,考虑目标文件夹带有空格的情况
46             #只允许使用相对路径进行跳转
47             data = data.split(maxsplit=1)
48             if len(data) == 2 and  os.path.isdir(data[1]) 
49                and data[1]!=os.path.abspath(data[1]):
50                 os.chdir(data[1])
51                 conn.send(b'ok')
52             else:
53                 conn.send(b'error')
54         #下载文件
55         elif data.startswith('get '):
56             data = data.split(maxsplit=1)
57             #检查文件是否存在
58             if len(data) == 2 and os.path.isfile(data[1]):
59                 conn.send(b'ok')
60                 fp = open(data[1], 'rb')
61                 while True:
62                     content = fp.read(4096)
63                     #发送文件结束
64                     if not content:
65                         conn.send(b'overxxxx')
66                         break
67                     #发送文件内容
68                     conn.send(content)
69                     if conn.recv(10) == b'ok':
70                         continue
71                 fp.close()
72             else:
73                 conn.send(b'no')
74         #无效命令
75         else:
76             pass
77             
78     conn.close()
79     print(str(addr)+'关闭连接')
80 
81 #创建Socket,监听本地端口,等待客户端连接
82 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
83 sock.bind(('', 10600))
84 sock.listen(5)
85 while True:
86     conn, addr = sock.accept()
87     #验证客户端输入的用户名和密码是否正确
88     userId, userPwd = conn.recv(1024).decode().split(',')
89     if userId in users and users[userId]['pwd'] == userPwd:
90         conn.send(b'ok')
91         #为每个客户端连接创建并启动一个线程,参数为连接、客户端地址、客户主目录
92         home = users[userId]['home']
93         t = threading.Thread(target=server, args=(conn,addr,home))
94         t.daemon = True
95         t.start()
96     else:
97         conn.send(b'error')
原文地址:https://www.cnblogs.com/cmnz/p/7092275.html