• 网络基础、多线程、ftp任务铺垫


    一、网络基础

    学习网络编程,了解一些网络基础的知识是必不可少的,下面学习一些基础的网络知识:

    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: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的对应关系在哪里?

                  本地:

                         Win本地电脑:

                                C:WindowsSystem32driversetchosts

                                11.22.33.44 www.baidu.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

    二、多线程

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

      import time
      import threading
    
      def task(a1,a2,a3):
          time.sleep(2)
          print('去拿快递')
    
      def work():
          print('去写作业')
    
      def wm():
          print('去拿外卖')
    
      # 创建一个线程  让该线程去执行任务:函数
      t1 = threading.Thread(target=task,args=(1,2,3,))
      t1.start()  # 去执行吧
    
      # 创建一个线程  让该线程去执行任务:函数
      t2 = threading.Thread(target=work)
      t2.start()  # 去执行吧
    
      # 创建一个线程  让该线程去执行任务:函数
      t3 = threading.Thread(target=wm)
      t3.start()  # 去执行吧
    
      print('玩扇子')
      print('煽风点火')
      print('耍贱...')
      # 分析:该程序创建了三个线程,分别去执行不同的任务(函数),主线程可以继续向下走。

      再看下面socket和线程配合的示例:

      
      import time
      import socket
      import threading
    
      def task(conn):
          time.sleep(2)
          data = conn.recv(1024)
          print(data)
          conn.close()
    
      server = socket.socket()
      server.bind(('127.0.0.1',8001,))
      server.listen(5)
    
      while True:
          conn,addr = server.accept()
          t = threading.Thread(target=task,args=(conn,))
          t.start()

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

        """
        安装requests模块:在终端执行如下命令自动安装(连网状态):
        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()
    多线程下载图片

      补充:uuid模块,模块uuid4()可以随机生成一个字符串,上述示例利用此模块给下载的图片命名:

        import uuid
    
        v = str(uuid.uuid4())
        print(v)  # d6b404d7-aa20-46f8-a135-90b624982f24

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

  • 相关阅读:
    SQL 查询第n条到第m条的数据
    Linq 中查询一个表中指定的字段
    归并排序与逆序对
    补码拾遗
    堆排序
    It is time to cut the Gordian Knot!
    蛋疼
    [引]Microsoft Visual Studio .NET 2005 预发行版
    关于VS2005中自动生成TableAdapter的事务处理
    关于释放ASPNET进程的内存占用问题.
  • 原文地址:https://www.cnblogs.com/li-li/p/9599591.html
Copyright © 2020-2023  润新知