zoukankan      html  css  js  c++  java
  • day30

    一、网络基础
      学习网络编程,我们必须了解一些基础的网络知识
      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 (子网掩码&ip=网段)
          网关IP:192.168.13.1
          局域网内、城域网、广域网:
            广播
            单播
            广播风暴
            arp协议
      3、DNS
        网络连接:
          - 域名解析
              www.baidu.com 220.181.57.216
          - 连接
      sk = socket.socket()
      sk.connect(('47.95.64.113',80))
      ...
        问题来了,域名和IP的对应关系在哪里?
    (1)先找本地:
              Win本地电脑:
                  C:WindowsSystem32driversetchosts
                  11.22.33.44 www.baidu.com
    Linux/Mac电脑:
    /etc/hosts

            (2)再找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

    二、多线程

      线程,英文是Thread,每个正在系统上运行的程度都是一个进程。每个进程包含一到多个线程。线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作,称为多线程。

      下面就是一个多线程的示例:

        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('耍贱...')
    
        结果:
            和女朋友去耍
            去拿外卖
            玩扇子
            煽风点火
            耍贱...
            拿快递 *
        分析结果:
            我们在一个程序中(进程)中执行了三个线程,
            但是第一个进程执行的时候,睡了2s.
            继续执行第二个,第三个.
            三个线程都执行了,虽然第一个没有完成,但是会继续执行第二个,第三个.
        结论: 所以,进程之间互不影响,同一个进程中的多个线程之间可以并发执行.    

      再看下面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()

      注意:以后如果想要提高效率可以使用多线程。如下示例,使用多线程下载多个图片:

    import uuid
    
    # 帮你生成一个随机字符串(与网卡,当前时间有关系)
    v = str(uuid.uuid4())
    print(v)
    给下载的图片命名--uuid模块
        """
        requests模块不是python内置模块(需要自己安装),
        在终端执行如下命令自动安装(连网状态):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):
            """
            ret = requests.get(url) 这一句做了5件事
            1. DNS解析,根据域名解析出IP
            2. 创建socket客户端    sk = socket.socket()
            3. 向服务端发起连接请求 sk.connect()
            4. 发送数据(我要图片) sk.send(...)
            5. 接收数据            sk.recv(8096)
        
            接收到数据后写入文件。   f.write(ret.content)
            """
            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()
    多线程下载图片

    三、FTP作业铺垫 

      1. 多用户同时登陆:  socketserver
      2. 用户登陆,加密认证:  md5加密
      3. 上传/下载文件,保证文件一致性:  md5加密
      4. 传输过程中现实进度条
      5. 不同用户家目录不同,且只能访问自己的家目录, 上传下载时,必须在自己目录:   os.path.join('D:sylar bftp_serverusers',username,'a.text')
      6. 对用户进行磁盘配额、不同用户配额可不同:    上传、下载之前做文件夹大小的判断。
      7. 用户登陆server后,可在家目录权限下切换子目录:    客户端向服务端发命令,subprocess.popen(命令)
      8. 查看当前目录下文件,新建文件夹 :  执行命令
      9. 删除文件和空文件夹 :   执行命令
      10. 充分使用面向对象知识+反射
      11. 支持断点续传 :  断点续传

      如何入手? 先掌握如何完成小功能点,最后再把这些小功能点拼接到一起.

  • 相关阅读:
    206.反转链表
    gprof
    Java【Stream流、方法引用】学习笔记
    Java【函数式接口(Supplier、Comsumer、Predicate、Function)】学习笔记
    Python exec 内置语句
    Python sorted() 函数
    Python oct() 函数
    Python id() 函数
    Python dir() 函数
    软件测试的方法
  • 原文地址:https://www.cnblogs.com/kangqi452/p/11690420.html
Copyright © 2011-2022 走看看