內容回顧:java
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:\Windows\System32\drivers\etc\hosts 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('耍賤...')
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()
每次執行都會生成一個隨機字符串框架
應用:當文件名(接受的文件隨機賦值一個文件名)socket
import uuid v = str(uuid.uuid4()) print(v)