中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PyThon3中網絡編程基礎實例

發布時間:2020-10-23 13:49:52 來源:億速云 閱讀:219 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關PyThon3中網絡編程基礎實例,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

編寫一個最簡單的Client/Server程序:

1、首先執行下面命令開啟一個監聽8000端口的HTTP服務器

python3 -m http.server 8000

Serving HTTP on 0.0.0.0 port 8000 ...

2、接著編寫一個程序,來對這個服務器發起HTTP請求:

import requests
r = requests.get('http://127.0.0.1:8000/')
print(r)

3、再執行這個程序:

bash-3.2$ python test.py
<Response [200]>

顯示服務器返回了一個200成功響應。

現在我們來總結請求過程:

客戶端向服務器端發起了一個HTTP(GET)請求。

服務器端向客戶端返回了一個HTTP(200)響應。

這是我們能看到的最抽象的過程,下面再用tcpdump細看發生了什么:

在命令行用tcpdump來監聽本地網卡的tcp連接。

tcpdump -i lo0 port 8000

再通過wireshark來觀察結果:

tcpdump -i lo0 port 8000 -w test.cap

現在執行程序:

bash-3.2$ python test.py
<Response [200]>

得到結果:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 262144 bytes
23:46:06.464962 IP localhost.49329 > localhost.irdmi: Flags [S], seq 1191154495, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 178410641 ecr 0,sackOK,eol], length 0
23:46:06.465018 IP localhost.irdmi > localhost.49329: Flags [S.], seq 1405387906, ack 1191154496, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 178410641 ecr 178410641,sackOK,eol], length 0
23:46:06.465029 IP localhost.49329 > localhost.irdmi: Flags [.], ack 1, win 12759, options [nop,nop,TS val 178410641 ecr 178410641], length 0
23:46:06.465039 IP localhost.irdmi > localhost.49329: Flags [.], ack 1, win 12759, options [nop,nop,TS val 178410641 ecr 178410641], length 0
23:46:06.465065 IP localhost.49329 > localhost.irdmi: Flags [P.], seq 1:146, ack 1, win 12759, options [nop,nop,TS val 178410641 ecr 178410641], length 145
23:46:06.465079 IP localhost.irdmi > localhost.49329: Flags [.], ack 146, win 12754, options [nop,nop,TS val 178410641 ecr 178410641], length 0
23:46:06.467141 IP localhost.irdmi > localhost.49329: Flags [P.], seq 1:156, ack 146, win 12754, options [nop,nop,TS val 178410642 ecr 178410641], length 155
23:46:06.467171 IP localhost.49329 > localhost.irdmi: Flags [.], ack 156, win 12754, options [nop,nop,TS val 178410643 ecr 178410642], length 0
23:46:06.467231 IP localhost.irdmi > localhost.49329: Flags [P.], seq 156:5324, ack 146, win 12754, options [nop,nop,TS val 178410643 ecr 178410643], length 5168
23:46:06.467245 IP localhost.49329 > localhost.irdmi: Flags [.], ack 5324, win 12593, options [nop,nop,TS val 178410643 ecr 178410643], length 0
23:46:06.467313 IP localhost.irdmi > localhost.49329: Flags [F.], seq 5324, ack 146, win 12754, options [nop,nop,TS val 178410643 ecr 178410643], length 0
23:46:06.467331 IP localhost.49329 > localhost.irdmi: Flags [.], ack 5325, win 12593, options [nop,nop,TS val 178410643 ecr 178410643], length 0
23:46:06.468442 IP localhost.49329 > localhost.irdmi: Flags [F.], seq 146, ack 5325, win 12593, options [nop,nop,TS val 178410644 ecr 178410643], length 0
23:46:06.468479 IP localhost.irdmi > localhost.49329: Flags [.], ack 147, win 12754, options [nop,nop,TS val 178410644 ecr 178410644], length 0

通過結果可得:

客戶端發起一個SYN報文,向服務器請求建立一個TCP連接。

服務器端返回一個SYN+ACK報文,表示服務器收到了客戶端傳來的請求,并同意與客戶端建立TCP連接。

客戶端返回一個ACK報文,表示已經知道服務器同意建立TCP連接,這時候雙方開始通信。

客戶端和服務器端不斷地交換信息,接收報文,返回應答。

最后數據傳輸完畢,服務器發起一個FIN報文,表示要結束通信,客戶端返回一個ACK應答,接著又發送一個FIN報文,最后服務器端返回一個ACK應答,此時連接過程結束。

現在再來看服務器端的狀態,通過lsof命令來查看綁定8000端口的描述符信息:

lsof -n -i:8000          
COMMAND    PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
python3.4 1128 tonnie    4u  IPv4 0x17036ae156ec58cf      0t0  TCP *:irdmi (LISTEN)

現在用剛才的例子來解釋TCP中狀態遷移的概念,這時候,如果從客戶端到來一個請求:

服務器端接收到客戶端的SYN報文,返回SYN+ACK報文,服務器端進入SYN_RCVD狀態。
服務器端收到客戶端返回的ACK應答后,連接建立,進入ESTABLISHED狀態。
服務器端的數據傳輸完畢,給客戶端發送FIN報文,進入FIN_WAIT_1狀態。
服務器端接收到客戶端返回的ACK應答后,進入FIN_WAIT_2狀態。
服務器端接收到客戶端的FIN報文,接著返回一個ACK應答,等待連接關閉,進入TIME_WAIT狀態。
服務器端經過2MSL時間后進入CLOSED狀態,此時連接關閉。

在上面的程序中,客戶端與服務器端的通信都要經過四個層(應用層、傳輸層、網絡層、網絡接口層)來打交道。那么這段Python程序都是通過socket操作連接的建立和關閉以及數據的傳輸等一系列方法。

客戶端最簡化代碼:

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('127.0.0.1', 8000))
sock.send(b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8000\r\n\r\n')
data = sock.recv(4096)
print(data)
sock.close()

服務器端最簡化代碼:

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('127.0.0.1', 8000))
sock.listen(5)
while 1:
    cli_sock, cli_addr = sock.accept()
    req = cli_sock.recv(4096)
    cli_sock.send(b'hello world')
cli_sock.close()

關于PyThon3中網絡編程基礎實例就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

尤溪县| 成都市| 当雄县| 湖口县| 鄄城县| 七台河市| 莒南县| 六盘水市| 肇东市| 盐津县| 明光市| 蓝田县| 鹤壁市| 嘉义县| 新巴尔虎左旗| 濉溪县| 时尚| 漯河市| 周至县| 柳林县| 东阿县| 封开县| 巧家县| 巨鹿县| 西吉县| 勐海县| 平邑县| 滦南县| 绥德县| 新余市| 安泽县| 嘉义市| 溆浦县| 玉田县| 麻江县| 铜陵市| 玉林市| 乌海市| 五华县| 策勒县| 南靖县|