Python 網路程式設計 自定義實現非同步IO

2021-10-25 01:32:47 字數 4603 閱讀 8059

一.客戶端

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...