一. Socketserver实现并发
1 import socketserver 2 3 class KnightServer(socketserver.BaseRequestHandler): 4 5 def handle(self): 6 # self.request 相当于conn链接通道 7 while 1: 8 from_client_msg = self.request.recv(1024) 9 print(from_client_msg.decode('utf-8')) 10 server_msg = input('服务端说>>>') 11 self.request.send(server_msg.encode('utf-8')) 12 13 14 if __name__ == '__main__': 15 ip_port = ('127.0.0.1',8001) 16 server = socketserver.ThreadingTCPServer(ip_port,KnightServer) 17 server.serve_forever()
1 import socket 2 import time 3 client = socket.socket() 4 client.connect(('127.0.0.1',8001)) 5 6 while 1: 7 client_data = input('别开车>>>') 8 client.send(client_data.encode('utf-8')) 9 10 from_server_msg = client.recv(1024) 11 print(from_server_msg.decode('utf-8')) 12 13 client.close()
- 启动服务端程序
- 执行 TCPServer.__init__ 方法,创建服务端Socket对象并绑定 IP 和 端口
- 执行 BaseServer.__init__ 方法,将自定义的继承自SocketServer.BaseRequestHandler 的类 MyRequestHandle赋值给self.RequestHandlerClass
- 执行 BaseServer.server_forever 方法,While 循环一直监听是否有客户端请求到达 ...
- 当客户端连接到达服务器
- 执行 ThreadingMixIn.process_request 方法,创建一个 “线程” 用来处理请求
- 执行 ThreadingMixIn.process_request_thread 方法
- 执行 BaseServer.finish_request 方法,执行 self.RequestHandlerClass() 即:执行 自定义 MyRequestHandler 的构造方法(自动调用基类BaseRequestHandler的构造方法,在该构造方法中又会调用 MyRequestHandler的handle方法
二. ftp
1.字符串操作以及打印 —— 实现上传下载的进度条功能
1 一、 2 import sys 3 import time 4 for i in range(50): 5 sys.stdout.write('>') 6 sys.stdout.flush() 7 time.sleep(0.2) 8 9 二、 10 #总共接收到的大小和总文件大小的比值: 11 #all_size_len表示当前总共接受的多长的数据,是累计的 12 #file_size表示文件的总大小 13 per_cent = round(all_size_len/file_size,2) #将比值做成两位数的小数 14 #通过\r来实现同一行打印,每次打印都回到行首打印 15 print('\r'+ '%s%%'%(str(int(per_cent*100))) + '*'*(int(per_cent*100)),end='') #由于float类型的数据没法通过%s来进行字符串格式化,所以我在这里通过int来转换了一下,并用str转换了一下,后面再拼接上*,这个*的数量根据现在计算出来的比值来确定,就能够出来%3***这样的效果。自行使用上面的sys.stdout来实现一下这个直接print的效果。 16 17 打印进度条
2.socketserver —— 实现ftp server端和client端的交互
3.struct模块 —— 自定制报头解决文件上传下载过程中的粘包问题
4.hashlib或者hmac模块 —— 实现文件的一致性校验和用户密文登录
5.os模块 —— 实现目录的切换及查看文件文件夹等功能
6.文件操作 —— 完成上传下载文件及断点续传等功能
看一下流程图: