• day 30 多线程 socketserver模块补充


    内容回顾:

    socket 模块

      服务端:收发数据 - > accept/recv

      客户端:收发数据 -> connect/recv

    1. 考试题
    1. 解释性和编译型
        编译型:
            先把代码编译成机器码  -> 计算机寄存器去运行  :C语言
            先把代码编译成XXX     -> 计算机找虚拟机执行代码->机器码交给计算技巧去运行        :C语言、java、C#
        解释型:
            边解释边执行
                
                def func():
                    print(name)
                    
                print(666)
    4. 
        列表: ''.join(['xx','ff'])
        字符串:list('xxxxxxxx') / split
    
    5. v[::-1]
    
    7. py2/py3 
        - 编码&字符串 
            字符串:
                py2: 
                    unicode         v = u"root"    本质上用unicode存储(万国码)
                    (str/bytes)     v = "root"     本质用字节存储
                py3:            
                    str                v = "root"     本质上用unicode存储(万国码)
                    bytes           v = b"root"    本质上用字节存储
            编码:
                py2: 
                    - ascii 
                    文件头可以修改:#-*- encoding:utf-8 -*-
                py3:
                    - utf-8
                    文件头可以修改:#-*- encoding:utf-8 -*-
                
                注意:文件是如何存储?
        - 继承
            py2: 经典类/新式类
            py3: 新式类
        - 范围
            py2:range/xrange
            py3:       range 
        - 输入
            py2: v1 = raw_input('请输入用户名:')
            py3: v2 = input('请输入用户名:')
        - 打印
            py2: print 'xx'
            py3: print(123)
        
            
    9. 以后写元组:
        v = (1,2,3,)
        
        Django框架静态文件配置
    
    2. 网络编程
    
    1. 我的电脑有网卡,网卡里有mac地址
    
    2. 我到某个地方插上网线,路由器或交换机中的DHCP服务为我自动分配IP地址。
        IP: 192.168.13.84
             IPv4
                00000000.00000000.00000000.00000000
                0~255    0~255    0~255    0~255
             IPv6 
                00000000.00000000.00000000.00000000.00000000.00000000
        子网掩码:255.255.255.0
            192.168.13.84
            255.255.255.0
            
            192.168.12.84
            255.255.255.0
            
        网关IP:192.168.13.1
            
        局域网内、城域网、广域网:
            广播
            单播
            广播风暴
            arp协议
        
    3. DNS
        
        网络连接:
            - 域名解析
                www.luffycity.com  47.95.64.113
                www.oldboyedu.com  101.200.195.98
            - 连接
                sk = socket.socket()
                sk.connect(('47.95.64.113',80))
                ...
        问题来了,域名和IP的对应关系在哪里?
            本地:
                Win本地电脑:
                    C:WindowsSystem32driversetchosts
                        11.11.11.11 luffycicy.com
                Linux/Mac电脑:
                    /etc/hosts 
            
            DNS服务器:全球顶级DNS服务器13台
                www.luffycity.com  47.95.64.113
                
        
        创业:
            a. 租一个服务器+公网IP
            b. 租域名
                域名+IP解析
            
    
    总结:
        1. DHCP,自动位局域网内容电脑分配IP。
        2. 网关,路由器中连接交换机的口。
        3. IP,4个点分的十进制表示  192.11.111.11
        4. 子网掩码,
                IP: 192.168.13.99
                掩码:255.255.255.0 
                
                将挡住的IP位数作为网段。
                未挡住的部分作为可变的值。
        5. 局域网/城域网/广域网 
        6. arp协议 
        7. DNS 
    
    3. 多线程 
    4. socketserver
    
    注意:以后如果想要提高效率可以使用多线程。
        
    
        """
        pip3 install requests
    
        """
        import threading
        import requests
        import uuid
    
        url_list = [
            'https://www3.autoimg.cn/newsdfs/g28/M05/F9/98/120x90_0_autohomecar__ChsEnluQmUmARAhAAAFES6mpmTM281.jpg',
            'https://www2.autoimg.cn/newsdfs/g28/M09/FC/06/120x90_0_autohomecar__ChcCR1uQlD6AT4P3AAGRMJX7834274.jpg',
            'https://www2.autoimg.cn/newsdfs/g3/M00/C6/A9/120x90_0_autohomecar__ChsEkVuPsdqAQz3zAAEYvWuAspI061.jpg',
        ]
    
        def task(url):
            """"""
    
            """
            1. DNS解析,根据域名解析出IP
            2. 创建socket客户端    sk = socket.socket()
            3. 向服务端发起连接请求 sk.connect()
            4. 发送数据(我要图片) sk.send(...)
            5. 接收数据            sk.recv(8096)
    
            接收到数据后写入文件。
            """
            ret = requests.get(url)
            file_name = str(uuid.uuid4()) + '.jpg'
            with open(file_name, mode='wb') as f:
                f.write(ret.content)
    
        for url in url_list:
    
            t = threading.Thread(target=task,args=(url,))
            t.start()
    考试讲解

     多线程:

      就是分出多个我,取同时执行任务,提高程序的执行效率。

    import threading
    def task(a,b,c):pass
    def play():psaa
    
    t1 = threading.Thread(target=task,args=(1,2,3,))  #分身一(创建一个线程,让线程取执行函数)
    t1.start()  #执行
    
    t2 = threading.Thread(target=play)   #分身二
    t2.start()
    #创建的线程位子线程,直接往下走的是函数的主线程
    # by luffycity.com
    import time
    import threading
    
    def task(a1,a2,a3):
        time.sleep(2)
        print('拿快递')
    
    def play():
        print('和女朋友去耍')
    
    
    def wm():
        print('去拿外卖')
    
    
    # 创建一个线程
    # 让该线程去执行任务:函数
    t1 = threading.Thread(target=task,args=(1,2,3,))
    # 去执行吧
    t1.start()
    
    
    # 创建一个线程
    # 让该线程去执行任务:函数
    t2 = threading.Thread(target=play)
    # 去执行吧
    t2.start()
    
    
    # 创建一个线程
    # 让该线程去执行任务:函数
    t3 = threading.Thread(target=wm)
    # 去执行吧
    t3.start()
    
    print('玩扇子')
    print('煽风点火')
    print('耍贱...')
    代码详细

    socket和线程的配合:

    import time
    import socket
    import threading
    
    def task(conn):
        time.sleep(20)
        data = conn.recv(1024)
        print(data)
        conn.close()
    
    
    server = socket.socket()
    server.bind(('192.168.13.84',8001,))
    server.listen(5)
    
    while True:
        conn,addr = server.accept()
        t = threading.Thread(target=task,args=(conn,))
        t.start()
     1 import socketserver
     2 
     3 class MyServer(socketserver.BaseRequestHandler):
     4     def handle(self):
     5         self.request
     6         self.client_address
     7         self.server
     8         # 编写代码
     9 
    10 server = socketserver.ThreadingTCPServer(('192.168.13.84',8001,),MyServer)
    11 """
    12 server.server_address = server_address
    13 server.RequestHandlerClass = RequestHandlerClass
    14 server.__is_shut_down = threading.Event()
    15 server.__shutdown_request = False
    16 server.socket = socket....
    17     - socket.bind
    18     - socket.listen
    19 """
    20 
    21 
    22 server.serve_forever()
    解析socket源码

    uuid模块

      每次执行都会生成一个随机字符串

      应用:当文件名(接受的文件随机赋值一个文件名)

    import uuid
    
    v = str(uuid.uuid4())
    print(v)
  • 相关阅读:
    android 请求网络异步载入
    A new Graph Game
    Android 高仿 频道管理----网易、今日头条、腾讯视频 (能够拖动的GridView)附源代码DEMO
    模块管理常规功能自己定义系统的设计与实现(16--模块数据的导出和打印[1])
    ganglia收集hbase的metrics
    ViewPager中View的复用
    PLY格式文件具体解释
    【RefactoringCode】The description of the refactoring book
    2.5星|《故事课2》:几个经典广告案例点评
    2星|叶檀《大破局》:2016年以来的财经时评文集,水平在平均线以下
  • 原文地址:https://www.cnblogs.com/xiaobai686/p/11795270.html
Copyright © 2020-2023  润新知