内容回顾:
socket 模块
服务端:收发数据 - > accept/recv
客户端:收发数据 -> connect/recv
1. 考试题 1. 解释性和编译型 编译型: 先把代码编译成机器码 -> 计算机寄存器去运行 :C语言 先把代码编译成XXX -> 计算机找虚拟机执行代码->机器码交给计算技巧去运行 :C语言、java、C# 解释型: 边解释边执行 def func(): print(name) print(666) 4. 列表: ''.join(['xx','ff']) 字符串:list('xxxxxxxx') / split 5. v[::-1] 7. py2/py3 - 编码&字符串 字符串: py2: unicode v = u"root" 本质上用unicode存储(万国码) (str/bytes) v = "root" 本质用字节存储 py3: str v = "root" 本质上用unicode存储(万国码) bytes v = b"root" 本质上用字节存储 编码: py2: - ascii 文件头可以修改:#-*- encoding:utf-8 -*- py3: - utf-8 文件头可以修改:#-*- encoding:utf-8 -*- 注意:文件是如何存储? - 继承 py2: 经典类/新式类 py3: 新式类 - 范围 py2:range/xrange py3: range - 输入 py2: v1 = raw_input('请输入用户名:') py3: v2 = input('请输入用户名:') - 打印 py2: print 'xx' py3: print(123) 9. 以后写元组: v = (1,2,3,) Django框架静态文件配置 2. 网络编程 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 192.168.13.84 255.255.255.0 192.168.12.84 255.255.255.0 网关IP:192.168.13.1 局域网内、城域网、广域网: 广播 单播 广播风暴 arp协议 3. DNS 网络连接: - 域名解析 www.luffycity.com 47.95.64.113 www.oldboyedu.com 101.200.195.98 - 连接 sk = socket.socket() sk.connect(('47.95.64.113',80)) ... 问题来了,域名和IP的对应关系在哪里? 本地: Win本地电脑: C:WindowsSystem32driversetchosts 11.11.11.11 luffycicy.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 3. 多线程 4. socketserver 注意:以后如果想要提高效率可以使用多线程。 """ 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()
多线程:
就是分出多个我,取同时执行任务,提高程序的执行效率。
import threading def task(a,b,c):pass def play():psaa t1 = threading.Thread(target=task,args=(1,2,3,)) #分身一(创建一个线程,让线程取执行函数) t1.start() #执行 t2 = threading.Thread(target=play) #分身二 t2.start()
#创建的线程位子线程,直接往下走的是函数的主线程
# by luffycity.com 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('耍贱...')
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()
1 import socketserver 2 3 class MyServer(socketserver.BaseRequestHandler): 4 def handle(self): 5 self.request 6 self.client_address 7 self.server 8 # 编写代码 9 10 server = socketserver.ThreadingTCPServer(('192.168.13.84',8001,),MyServer) 11 """ 12 server.server_address = server_address 13 server.RequestHandlerClass = RequestHandlerClass 14 server.__is_shut_down = threading.Event() 15 server.__shutdown_request = False 16 server.socket = socket.... 17 - socket.bind 18 - socket.listen 19 """ 20 21 22 server.serve_forever()
uuid模块
每次执行都会生成一个随机字符串
应用:当文件名(接受的文件随机赋值一个文件名)
import uuid v = str(uuid.uuid4()) print(v)