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. 支持断点续传 :  断点续传

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

原文地址:https://www.cnblogs.com/kangqi452/p/11690420.html