网络基础、多线程、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:\Windows\System32\drivers\etc\hosts
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
一、网络基础(继续补充)
1、端口,是什么?为什么要有端口?
端口是为了将同一个电脑上的不同程序进行隔离。
IP是找电脑;端口是找电脑上的应用程序;
端口范围:1 – 65535 ; 1 - 1024 不要用 ; 一般程序员用8000、8001……
2、OSI 七层模型(记住哪七层)
应用层,使用软件; 打开软件或网站
表示层,看到数据,如图片和视频; 生产原始数据
会话层,保持登录或链接状态; 应用偷偷携带一点其他数据: 令牌 19rRNAwf8g
传输层,TCP/UDP; [TCP][原始数据|19rRNAwf8g]
网络层,IP; 【IP】【[TCP][原始数据|19rRNAwf8g]】
数据链路层,MAC; [MAC][ 【IP】【[TCP][原始数据|19rRNAwf8g]】]
物理层,将数据转换成电信号发送;
3、TCP三次握手,四次挥手
socket客户端向服务端发起连接请求:三次握手(只能先由客户端向服务端发起请求)
client.connect((……))
客户端 服务端
我能打你吗
来呀来呀
好的,我这就来
----------------------------------------
client.send(收发数据)
收发数据 收发数据
客户端和服务端断开连接:四次挥手(客户端和服务端都可以主动断开连接)
client.close() 或者 conn.close()
------------------------------------------------------------
我要断开连接
断开就断开,等我处理一些手头的事情
……
我处理完了,断开吧
拜拜
补充:断开连接时,反应到代码上:抛出异常(windows)/发送空内容(linux和mac系统)
总结:必须了解网络相关知识。
二、多线程
线程,英文是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()
注意:以后如果想要提高效率可以使用多线程。如下示例,使用多线程下载多个图片:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
""" 安装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\nbftp_server\users',username,'a.text') 6. 对用户进行磁盘配额、不同用户配额可不同: 上传、下载之前做文件夹大小的判断。 7. 用户登陆server后,可在家目录权限下切换子目录: 客户端向服务端发命令,subprocess.popen(命令) 8. 查看当前目录下文件,新建文件夹 : 执行命令 9. 删除文件和空文件夹 : 执行命令 10. 充分使用面向对象知识+反射 11. 支持断点续传 :断点续传