python-day29(socketserver ftp知识点讲解)

一. 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     #通过
来实现同一行打印,每次打印都回到行首打印
15         print('
'+ '%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.文件操作 —— 完成上传下载文件及断点续传等功能

  看一下流程图:

原文地址:https://www.cnblogs.com/Thui/p/10021214.html