• 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.文件操作 —— 完成上传下载文件及断点续传等功能

      看一下流程图:

  • 相关阅读:
    Vue之仿百度搜索框
    Vue之交互
    Vue之键盘事件
    Vue之事件冒泡
    Vue之阻止默认行为
    sql注入常用注释符总结
    什么是Git
    Github部署博客
    php笔记
    JavaScript(更新中)
  • 原文地址:https://www.cnblogs.com/Thui/p/10021214.html
Copyright © 2020-2023  润新知