http協議,阻塞IO,非阻塞IO,IO多路複用,位運算,select方法
HTTP請求 Request
請求格式:
請求行
GET / HTTP/1.1
請求種類 請求內容 協議版本
請求種類 : GET 獲取網路資源
POST 提交一定的附加資料,得到返回 結果
HEAD 獲取響應頭
PUT 更新伺服器資源
DELETE 刪除伺服器資源
CONNECT 預留
TRACE 測試
OPTIONS 獲取伺服器效能
請求頭 對請求內容的具體描述
* 以鍵值對的形式對請求資訊進行描述
e.g.
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
空行
請求體 提交具體的請求引數
HTTP響應 Response
響應格式
響應行 反饋具體的響應情況
HTTP/1.1 200 OK
版本資訊 響應碼 附加資訊
響應碼 : 1xx 提示資訊 表示請求已經接受
2xx 響應成功
3xx 響應需要重新請定向
4xx 客戶端錯誤
5xx 伺服器錯誤
常見響應碼 : 200 成功
404 請求頁面不存在
401 沒有訪問許可權
500 伺服器發生未知錯誤
503 伺服器暫時無法執行
響應頭 對響應資訊的具體描述
e.g.
Cache-Control: private
Connection: Keep-Alive
空行
響應體 將客戶想要的內容進行返回
要求 : 知道什麼是HTTP協議,功能特點
知道請求和響應的格式和作用
知道請求頭的種類,基本的響應碼的意義
瞭解http請求和響應的完整過程
基礎的http服務流程程式
1. 接收http請求
2. 給出一定的響應
通過tcp進行檔案傳輸
read --》 send
recv --> write
IO input output
凡是在記憶體中存在資料交換的操作都可以認為是IO操作
比如: 記憶體和磁碟互動 讀寫 read write
記憶體和終端互動 print input
記憶體和網路互動 recv send
IO密集型程式 : 程式的執行過程中進行大量的IO操作,而只有較少的cpu運算。消耗計算機資源較少,執行時間長。
CPU密集型程式(計算密集型): 程式執行中需要大量的cpu運算,IO操作較少。消耗cpu資源多,執行速度快
IO分類
阻塞IO 非阻塞IO IO多路複用 事件IO 非同步IO
阻塞IO : 預設形態 效率很低的一種IO
阻塞情況 : * 因為某種條件沒有達到造成的阻塞
e.g. input accept recv
* 處理IO事件的時間消耗較長帶來阻塞
e.g. 檔案的讀寫過程,網路資料傳送過程
非阻塞IO : 通過修改IO事件的屬性,使其變為非阻塞狀態,即避免條件阻塞的情況
* 非阻塞IO往往和迴圈搭配使用,這樣可以不斷執行部分需要執行的程式碼,也不影響對阻塞條件的判斷
設定套接字為非阻塞
s.setblocking()
功能 : 設定套接字的阻塞狀態
引數 : 設定為False則套接字呼叫函式為非阻塞
超時檢測
將原本阻塞的IO設定一個最長阻塞等待時間,在規定時間內如果達到條件則正常執行,如果時間到仍未達到條件則結束阻塞。
s.settimeout(sec)
功能 : 設定套接字超時時間
引數 : 設定的時間
IO多路複用
定義 : 同時監控多個IO事件,當哪個IO事件準備就緒就執行哪個IO事件。 此時形成多個IO時間都可以操作的現象,不必逐個等待執行。
準備就緒 : IO事件即將發生的臨界狀態
import select
select ---》 windows linux unix
poll ---》 linux unix
epoll ---》 linux unix
r, w, x = select(rlist, wlist, xlist[, timeout])
功能: 監控IO事件,阻塞等待IO事件發生
引數: rlist 列表 存放被動等待處理的IO事件
wlist 列表 存放需要主動處理的IO
xlist 列表 存入如果發生異常需要處理的IO
timeout 超時時間
返回值 : r 列表 rlist中準備就緒的IO
w 列表 wlist中準備就緒的IO
x 列表 xlist中準備就緒的IO
注意事項 :
1. IO多路複用 處理IO的過程中不應有死迴圈出現,使一個客戶端長期佔有服務端
2. IO多路複用是一種併發行為,但是是單程序程式,效率較高
位運算
按照二進位制位來進行運算操作
& 按位與
| 按位或
^ 按位異或
<< 左移
>> 右移
11 1011
14 1110
11 & 14 --》10
11 | 14 --》15
11 ^ 14 --> 5
11 << 2 --> 44
14 >> 2 --> 3
使用 : 1 在底層做硬體暫存器的操作
2 做標誌位的過濾選擇
1.建立poll物件
p=select.poll()
2.註冊關注的IO
p.register(s,POLLIN|POLLHUP)
p.unregister(s)
3.監控IO
events=p.poll()
功能個:監控關注的IO事件
返回值:返回發生的IO事件
events 是一個列表 [(fileno,event),(),()...]
每個就緒IO對應列表中一個元組:(描述符,就緒事件)
IO地圖:
{s.fileno():s}
4.處理IO事件