第一阶段
服务端:
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()
第四阶段
浙公网安备 33010602011771号