第一阶段

服务端:

 1 #huangjiaping
 2 import socketserver,os
 3 ip_port = ('localhost',9090)
 4 class Mysocket(socketserver.BaseRequestHandler):
 5     def handle(self):
 6         while True:
 7             print("有客户端进入链接")
 8             data_01 = self.request.recv(1024)
 9             print(data_01)
10 
11             data_02 = os.popen(data_01.decode()).read()
12             if len(data_02) == 0:
13                 data_02 = "无效的命令!"
14             self.request.sendall(data_02.encode())
15 
16 if __name__ == '__main__':
17     s = socketserver.ThreadingTCPServer(ip_port,Mysocket)
18     s.serve_forever()

 

客户端: 

1 import os,socket
2 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
3 client.connect(('localhost',9090))
4 while True:
5     data_01 = input("》》")
6     client.send(data_01.encode())
7     if len(data_01) == 0:continue
8     data_02 = client.recv(2014)
9     print(data_02.decode())

第二阶段

 第一次为接触过项目开发的人,基本都是会这样的写的,但是这样写的话,如果是简单的实现功能还可以,但是要是遇到比较复杂的程序开发,就会遇到各种复杂的问题,其中就有一点,代码的可读性不高。

所以今天我就是简单实现以下ftp文件的上传功能来给大家看看。

服务端:

 1 import socketserver,os,json
 2 ip_port = ('localhost',9090)
 3 class Mysocket(socketserver.BaseRequestHandler):
 4     def put(self,*args):#接受客户端文件
 5         cmd_dic = args[0]
 6         filename = cmd_dic["filename"]
 7         filesize = cmd_dic["size"]
 8         if os.path.isfile(filename):#判断文件的存在
 9             f = open(filename + ".new","wb")
10 
11         else:
12             f = open(filename,"wb")
13         self.request.send(b"200 ok")
14         received_size = 0
15         while received_size<filesize:
16             data = self.request.recv(1024)
17             f.write(data)
18             received_size+=len(data)
19         else:
20             print("file [%s] has uploaded.."%filename)
21     def get(self,*args):
22         pass
23 
24 
25 
26 
27     def handle(self):
28         while True:
29             try:
30                 print("有客户端进入链接")
31                 self.data = self.request.recv(1024).strip()
32                 print(self.data)
33                 #对客户端发来的确定信息进行处理
34                 cmd_dic = json.loads(self.data.decode())
35                 action = cmd_dic["action"]
36                 if hasattr(self,action):
37                     func = getattr(self,action)
38                     func(cmd_dic)
39             except ConnectionRefusedError as e:
40                 print("err",e)
41                 break
42 
43 
44 
45 if __name__ == '__main__':
46     s = socketserver.ThreadingTCPServer(ip_port,Mysocket)
47     s.serve_forever()

 

客户端:

 1 import os,socket,json
 2 class client():
 3     def __init__(self):#实例化socket对象
 4         self.client=socket.socket()
 5     def help(self):
 6         pass
 7     def connection(self,ip,port):#连接服务器
 8         self.client.connect((ip,port))
 9     def interactive(self):#用户输入命令
10         while True:
11             cmd=input(">>").strip()
12             if len(cmd)==0:continue
13             cmd_str = cmd.split()[0]#命令进行接片,选择第一个命令
14             if hasattr(self,"cmd_%s"%cmd_str):#通过反射来判断命令
15                 func = getattr(self,"cmd_%s"%cmd_str)
16                 func(cmd)
17             else:
18                 self.help()
19     def cmd_put(self,*args):#上传文件
20         cmd_split = args[0].split()#切片
21         #print(args)#元组
22         #print(args[0])#字符串
23         #print(cmd_split)#列表
24         if len(cmd_split) > 1:
25             print(len(cmd_split))
26             filename = cmd_split[1]#获取文件名
27             if os.path.isfile(filename):#查询文件名是否存在
28                 filesize = os.stat(filename).st_size#检查文件的大小
29                 msg_dic = {
30                     "action": "put",
31                     "filename": filename,
32                     "size": filesize,
33                     "overridden": True
34                 }
35                 self.client.send( json.dumps(msg_dic).encode('utf-8'))#发送文件信息到服务器
36                 #防止占包,等待服务器返回确认
37                 server_response = self.client.recv(1024)
38                 f = open(filename,"rb")
39                 print(f)
40                 for line in f:
41                     self.client.send(line)#发送文件
42                 else:
43                     print("file upload success!")
44                     f.close()
45             else:
46                 print(filename,"is not exit")
47     def cmd_get(self,*args):#下载文件
48         pass
49 
50 client_ftp = client()
51 client_ftp.__init__()
52 client_ftp.connection('localhost',9090)
53 client_ftp.interactive()

这样就能够将程序中每个功能通过类的方法表现出来,可读性高了不少。

第三阶段 

既然有了上传的功能,肯定还有下载功能和进度条

服务端:

 1 import socketserver,os,json
 2 ip_port = ('localhost',9090)
 3 class Mysocket(socketserver.BaseRequestHandler):
 4     def put(self,*args):#接受客户端文件
 5         cmd_dic = args[0]
 6         filename = cmd_dic["filename"]
 7         filesize = cmd_dic["size"]
 8         if os.path.isfile(filename):#判断文件的存在
 9             f = open(filename + ".new","wb")
10 
11         else:
12             f = open(filename,"wb")
13         self.request.send(b"200 ok")
14         received_size = 0
15         while received_size<filesize:
16             data = self.request.recv(1024)
17             f.write(data)
18             received_size+=len(data)
19         else:
20             print("file [%s] has uploaded.."%filename)
21     def get(self,*args):#args是客户端发来的信息,get方法是发送文件给client端
22         cmd_dic = args[0]
23         filename = cmd_dic["filename"]
24         filesize = os.stat(filename).st_size#int类型
25         msg_dic = {
26             "filename": filename,
27             "size": filesize,
28             "overridden": True
29         }
30         self.request.send(json.dumps(msg_dic).encode('utf-8'))
31         #等待客户端回应
32         data = self.request.recv(1024)
33         f = open(filename, "rb")
34         print(f)
35         for line in f:
36             self.request.send(line)  # 发送文件
37         else:
38             print("file upload success!")
39             f.close()
40     def handle(self):#处理客户端发来的信息
41         while True:
42             try:
43                 print("有客户端进入链接")
44                 self.data = self.request.recv(1024).strip()#接受客户端的信息
45                 print(self.data)
46                 #对客户端发来的确定信息进行处理
47                 cmd_dic = json.loads(self.data.decode())#字符类型变成字典
48                 action = cmd_dic["action"]
49                 print(cmd_dic)
50                 print(type(cmd_dic))#传进来的参数是字典
51                 if hasattr(self,action):
52                     func = getattr(self,action)
53                     func(cmd_dic)
54             except ConnectionRefusedError as e:
55                 print("err",e)
56                 break
57 
58 
59 
60 if __name__ == '__main__':
61     s = socketserver.ThreadingTCPServer(ip_port,Mysocket)
62     s.serve_forever()

客户端:

 1 import os,socket,json,sys
 2 class client():
 3     def __init__(self):#实例化socket对象
 4         self.client=socket.socket()
 5     def help(self):
 6         pass
 7     def connection(self,ip,port):#连接服务器
 8         self.client.connect((ip,port))
 9     def start(self):#用户登录验证
10         pass
11     def interactive(self):#用户输入命令
12         while True:
13             cmd=input(">>").strip()
14             if len(cmd)==0:continue
15             cmd_str = cmd.split()[0]#命令进行接片,选择第一个命令
16             if hasattr(self,"cmd_%s"%cmd_str):#通过反射来判断命令
17                 func = getattr(self,"cmd_%s"%cmd_str)
18                 func(cmd)
19             else:
20                 self.help()
21     def cmd_put(self,*args):#上传文件
22         cmd_split = args[0].split()#切片
23         #print(args)#元组
24         #print(args[0])#字符串
25         #print(cmd_split)#列表
26         if len(cmd_split) > 1:
27             print(len(cmd_split))
28             filename = cmd_split[1]#获取文件名
29             if os.path.isfile(filename):#查询文件名是否存在
30                 filesize = os.stat(filename).st_size#检查文件的大小
31                 msg_dic = {
32                     "action": "put",
33                     "filename": filename,
34                     "size": filesize,
35                     "overridden": True
36                 }
37                 self.client.send( json.dumps(msg_dic).encode('utf-8'))#发送文件信息到服务器
38                 #防止占包,等待服务器返回确认
39                 server_response = self.client.recv(1024)
40                 f = open(filename,"rb")
41                 print(f)
42                 for line in f:
43                     send_size =f.tell()
44                     self.client.send(line)#发送文件
45                     self._progress(send_size,filesize,'上传中')
46                 else:
47                     print("\nfile upload success!")
48                     f.close()
49             else:
50                 print(filename,"is not exit")
51     def cmd_get(self,*args):#下载文件args=cmd用户输入的命令
52         cmd_clit = args[0].split()
53         filename = cmd_clit[1]
54         msg_dic = {
55             "action": "get",
56             "filename": filename,
57             "overridden": True
58         }
59         self.client.send(json.dumps(msg_dic).encode('utf-8'))
60         self.server_response = self.client.recv(1024)
61         cmd_dic = json.loads(self.server_response.decode())
62         self.client.send(b"client is ok")
63         if os.path.isfile(filename):#判断文件的存在
64             f = open(filename + ".new","wb")
65 
66         else:
67             f = open(filename,"wb")
68         received_size = 0
69         ok_size = cmd_dic["size"]
70         while received_size < ok_size:#开始接受文件
71             data = self.client.recv(1024)
72             f.write(data)
73             received_size += len(data)
74             self._progress(received_size,ok_size,'下载中')
75         else:
76             print("\nfile [%s] has uploaded.." % filename)
77 
78     def _progress(self,received_size,ok_size,mode):#显示进度条
79         bar_length = 100
80         percent = float(received_size) / float(ok_size)
81         hashes = '=' * int(percent * bar_length)
82         spaces = ' ' * int(bar_length - len(hashes))
83         sys.stdout.write('\r%s:%.2fM/%.2fM %d%% [%s]' \
84                          % (mode, received_size / 1048576, ok_size / 1048576, percent * 100, hashes + spaces))
85 client_ftp = client()
86 client_ftp.__init__()
87 client_ftp.connection('localhost',9090)
88 client_ftp.interactive()

第四阶段 

 

posted on 2020-03-15 17:02  学习永远没有尽头  阅读(296)  评论(0)    收藏  举报