一.客戶端
1.傳送http請求的本質:
import select,socket
sk=socket.socket(
)#1.連線:
))#io阻塞
#80埠是通常預設向http開放的埠,一般使用該埠;如果使用其他埠,需要確保伺服器開啟了相應的埠
print
("連線成功"
)#2.傳送請求:
)#自定義封裝http資料報
#3.等待響應:
data=sk.recv(
8096
)#io阻塞
print
(data)
#4.斷開連線:
sk.close(
)
2.實現非同步io:
本質上就是io多路復用(監聽多個socket物件)
+非阻塞socket
)#分割請求頭和請求體,因為請求體中可能還有"\r\n\r\n",故限制只使用第1個進行分割
self.body=body
headers_list=headers.split(b"\r\n"
)for h in headers_list:
h_str=
str(h,encoding=
"utf-8"
) v=h_str.split(
":",1)
#分割請求頭中鍵值對的鍵和值
iflen
(v)==2:
self.headers_dict[v[0]
]=v[1]
elif
len(v)==1
: self.headers_dict[
"method"
]=h_str
class
asyncrequest
:def
__init__
(self)
: self.conn=
#所有httprequest物件
self.connection=
#未連線成功的httprequest物件
defadd_request
(self,host,callback)
:try
: sk=socket.socket(
) sk.setblocking(0)
#0也可以換成false
#無資料(連線無響應或資料未返回)就立刻報錯(blockingioerror),不等待伺服器響應
#在wlist中表示可寫,此時可以傳送資訊;w是自定義的httprequest物件
print
(w.host,
"連線成功"
#每次迴圈向1個伺服器傳送請求
for r in rlist:
#在rlist中表示可讀,說明收到資訊;r也是自定義的httprequest物件
#準確地說,在rlist中表示狀態發生變化,參見 python.網路程式設計.io模型.四.3 部分
print
(r.host,
"收到響應"
) recv_data=
bytes()
while
true
:try
: chunk=r.socket.recv(
8096
) recv_data+=chunk
except exception as e:
break
print
(r.host,
"返回了:"
#對返回的資料進行相應的處理
r.socket.close(
) self.conn.remove(r)
#1次迴圈處理1個響應
iflen
(self.conn)==0
:#所有請求都已收到響應並已斷開
break
deff1
(response)
:print
(response.headers_dict)
deff2
(response)
:print
(response.headers_dict)
deff3
(response)
:print
(response.headers_dict)
url_list=[,
#220.181.38.150;使用ip也可以
,#204.79.197.200
#118.31.180.41
]req=asyncrequest(
)for item in url_list:
print
(item[
"host"])
req.add_request(item[
"host"
],item[
"callback"])
req.run(
)#結果:
] 無法立即完成乙個非阻止性套接字操作。
cn.bing.com
[winerror 10035
] 無法立即完成乙個非阻止性套接字操作。
www.cnblogs.com
[winerror 10035
] 無法立即完成乙個非阻止性套接字操作。
www.baidu.com 連線成功
cn.bing.com 連線成功
www.baidu.com 收到響應
www.baidu.com 返回了: b'http/1.0 200 ok\r\naccept-ranges:...'
(省略)
www.cnblogs.com 連線成功
www.cnblogs.com 收到響應
www.cnblogs.com 返回了: b'http/1.1 301 moved permanently\r\ndate:...'
(省略)
cn.bing.com 收到響應
cn.bing.com 返回了: b'http/1.1 200 ok\r\ncache-control:...'
(省略)
網路程式設計 自定義程序類
建立自定義程序類 編寫類繼承process 在自定義類中載入父類 init 以獲取父類屬性,同時可以自定義新的屬性 重寫run方法,在呼叫start時自動執行該方法 from multiprocessing import process import time class clockprocess ...
網路程式設計(六) 自定義報頭
當你正在給你朋友顯擺你的 的時候,飄過來乙個大神隨口說道 這 有問題 大神說的話不能不當真啊,誰讓你是個菜雞,你仔細想了一會兒。嗯,確實有問題 首先,我剛才做的報頭,按照協議來說應該不只有長度資訊,還應該有其他資訊 其次就是這個struct模組,它是有長度範圍限制的 struct.pack i 10...
Docker之自定義網路實現
目錄 四類網路模式,使用docker network www.cppcns.comls檢視docker網路模式 docker網路模式 配置說明 host模式 net host 容器和宿主機共享network namespace。container模式 net container name or id...