day30

元气小坏坏 提交于 2019-12-01 15:34:26
一、网络基础  学习网络编程,我们必须了解一些基础的网络知识  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:\Windows\System32\drivers\etc\hosts              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()
"""
    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\nbftp_server\users',username,'a.text')
  6. 对用户进行磁盘配额、不同用户配额可不同:    上传、下载之前做文件夹大小的判断。
  7. 用户登陆server后,可在家目录权限下切换子目录:    客户端向服务端发命令,subprocess.popen(命令)
  8. 查看当前目录下文件,新建文件夹 :  执行命令
  9. 删除文件和空文件夹 :   执行命令
  10. 充分使用面向对象知识+反射
  11. 支持断点续传 :  断点续传

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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!