一、网络基础 学习网络编程,我们必须了解一些基础的网络知识 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. 支持断点续传 : 断点续传
如何入手? 先掌握如何完成小功能点,最后再把这些小功能点拼接到一起.
