day20 網絡程式設計
課程目标:掌握網絡相關的基礎知識并可以基于Python開發程式(基于網絡進行資料傳輸)。
課程概要:
- 網絡必備基礎
- 網絡程式設計(Python代碼)
- B/S和C/S架構
文章目錄
- day20 網絡程式設計
- 1.必備基礎
- 1.1 網絡架構
- 1.1.1 交換機
- 1.1.2 路由器
- 1.1.3 三層交換機
- 1.1.4 小型企業基礎網絡架構
- 1.1.5 家庭網絡架構
- 1.1.6 網際網路
- 1.2 網絡核心詞彙
- 1.2.1 子網路遮罩和IP
- 1.2.2 DHCP
- 1.2.3 内網和公網IP
- 1.2.4 雲伺服器
- 1.2.5 端口
- 1.2.6 域名
- 2. 網絡程式設計
- 案例:智障客服
- 案例:檔案上傳
- 3. B/S和C/S架構
- 總結
- 作業
1.必備基礎
你必須了解的網絡相關裝置和基礎概念。
1.1 網絡架構
假設 alex 上了一個野雞大學買了一台電腦,電腦裡存了1部小電影,整宿整宿的在宿舍反複的看。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-5Msf0KdD-1614517279919)(assets/image-20210204184431053-3881170.png)]
alex 如何想要和室友 于超 進行收發資料,可以通過一根網線來進行連接配接,并進行資料的傳輸。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-Ciyik8BE-1614517279920)(assets/image-20210204185417337-3881170.png)]
1.1.1 交換機
其他2位室友如何也想和他們的電腦互相連接配接然後進行資源的共享,此時就需要一個裝置 【二層交換機】元件一個區域網路。
當電腦接入交換機之後,我們需要為每台電腦組態設定一個IP,例如:
- 電腦1:192.168.10.1
- 電腦2:192.168.10.2
- 電腦3:192.168.10.3
- 電腦4:192.168.10.4
區域網路内容個電腦之間是基于ARP協定來進行通信,例如:A電腦向 IP為192.168.10.3的另一個電腦發送消息。
第一步:A封裝資料包,此時隻知道目标IP不知道目标mac位址(未知mac位址時預設會設定為FF)。
第二步:将資料包發送到交換機,交換機通過廣播的形式将資料發送給所有電腦。
第三步:目标電腦接收到資料包後,監測自己是否是目标IP。
- 是,收到資料并回複。
- 不是,則丢棄包。
為防止每次發送消息都是廣播形式,每台電腦的内部都為維護了一個ARP表,接受到資料時(無論是否自己的)都會記錄自己了解的IP和MAC的對應關系,例如:
Internet位址 實體位址
192.168.10.1 14-9d-da-2a-dd-0a
192.168.10.3 14-9d-da-2a-dd-0c
...
以便于下次在發送消息時,就知道了目标的mac位址,直接讓交換機轉發給指定的電腦(單點傳播)。
同時,當有消息發送經過二層交換機時他的内容也會維護記錄了交換機接口和連接配接的電腦的mac位址的對應關系,例如:
接口(網卡) mac位址
接口1 14-9d-da-2a-dd-0A
接口2 14-9d-da-2a-dd-0B
接口3 14-9d-da-2a-dd-0C
...
這樣一來,交換機在進行資料轉發時,效率就更高了。
注意:每台電腦出廠時在網卡中都設定了唯一的mac位址(不重複),網卡內建在主機闆上,如果更換了主機闆則mac位址也會變更。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-WsAB2M1r-1614517279922)(assets/image-20210205143317465-3881170.png)]
頭部資訊:xxx
資料:你好
頭部資訊:xxx
資料:收到
1.1.2 路由器
多個宿舍之間想想要組建一個互相可以通信網絡,此時需要【二層交換機】和【企業路由器】配合組建稍微大一點的區域網路(同時也可緩解廣播風暴)。
劃分好網絡結構之後,其實會給各宿舍的電腦組態設定IP和網關,例如:
宿舍A:
- 電腦1:192.168.10.1 網關:192.168.10.254
- 電腦2:192.168.10.2 網關:192.168.10.254
- 電腦3:192.168.10.3 網關:192.168.10.254
- 電腦4:192.168.10.4 網關:192.168.10.254
宿舍B
- 電腦1:192.168.20.1 網關:192.168.20.254
- 電腦2:192.168.20.2 網關:192.168.20.254
- 電腦3:192.168.20.3 網關:192.168.20.254
- 電腦4:192.168.20.4 網關:192.168.20.254
然後再在路由器中配置路由表(包含網段和路由器上的接口的對應關系),例如:
接口 IP
eth0 192.168.10.254(192.168.10網段)
eth1 192.168.20.254(192.168.20網段)
想與外部網絡通信,需要配置網關,網關就是路由表中配置的指向此網段的IP。其實就類似于貿易出口都需要經過海關。
資料通信的過程結合了APR協定和IP協定,例如:宿舍A的電腦1向宿舍B的電腦3發送消息(目标IP:192.168.20.3)。
簡化過程:
- 宿舍A的電腦1,通過廣播或單點傳播将資料發送到網管(路由器)
-
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-qhZtJmmr-1614517279924)(assets/image-20210204205902286-3890545.png)]
1.1.3 三層交換機
三層交換機內建了 交換機 & 路由器的功能(大部分路由器功能),上述的三個裝置其實可以用一個三層交換機就可以搞定。
按照下圖,在三層交換機上分别做如下幾件事:
1. 劃分兩個vlan,模拟出來路由器的兩個接口。
2. 将交換機的接口劃分給指定的vlan,例如:
接口1、2、3劃分給一個vlan,相當于交換機連接配接上了路由器。
接口4、5、6劃分給一個vlan,相當于交換機連接配接上了路由器。
3. 電腦連接配接上交換機。
4. 進行相應的配置。
宿舍A(左邊)電腦組態:
- 電腦1:192.168.10.1 網關:192.168.10.254 對應交換機接口:1
- 電腦2:192.168.10.2 網關:192.168.10.254 對應交換機接口:2
- 電腦3:192.168.10.3 網關:192.168.10.254 對應交換機接口:3
宿舍B(右邊)電腦組態:
- 電腦1:192.168.20.1 網關:192.168.20.254 對應交換機接口:4
- 電腦2:192.168.20.2 網關:192.168.20.254 對應交換機接口:5
- 電腦3:192.168.20.3 網關:192.168.20.254 對應交換機接口:6
交換機中的路由配置:
接口 IP
左vlan 192.168.10.254(192.168.10網段)
右vlan 192.168.20.254(192.168.20網段)
通過上述的配置之後,就可以實作宿舍A和宿舍B的網絡通信了。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-XF04GUFw-1614517279926)(assets/image-20210206092454106-3881170.png)]
1.1.4 小型企業基礎網絡架構
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-K5f8c4ia-1614517279926)(assets/image-20210206225844012.png)]
1.1.5 家庭網絡架構
家用路由器內建了是交換機和路由的功能(性能差、價格便宜)。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-MnJi62Sq-1614517279927)(assets/image-20210206231121896.png)]
1.1.6 網際網路
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-SJR82C74-1614517279928)(assets/image-20210206231602247.png)]
1.2 網絡核心詞彙
1.2.1 子網路遮罩和IP
之前說過,接入網絡裝置後,需要一個IP來代指次電腦,例如:192.168.10.1 。
IP其是一個32位的二進制,為了便于記憶就将它分為4組,每組8位,由小數點分開,例如:
二進制表示:00000000.10010111.11111111.00001111
十進制表示:251.151.255.15
0~255
192.178.11.211
192.178.11.311
在網絡中的每台電腦都會有一個IP與之綁定,這樣通過IP就可以找到相應的電腦。
一個IP位址可以劃分為兩個部分,即:網絡位址 + 主機位址。
- 問題1:如何确定網絡位址和主機位址呢?
通過子網路遮罩就可以确定IP的網絡位址和主機位址。
示例1:
IP:192.168.1.199 11000000.10101000.00000001.11000111
子網路遮罩:255.255.255.0 11111111.11111111.11111111.00000000
此時,網絡位址就是前24位 + 主機位址是後8位。你可能見過有些IP這樣寫 192.168.1.199/24,意思也是前24位是網絡位址。
示例2:
IP:192.168.99.254 11000000.10101000.01100011.11111110
子網路遮罩:255.255.240.0 11111111.11111111.11111100.00000000
此時,網絡位址就是前22位 + 主機位址是後10位。你可能見過有些IP這樣寫 192.168.99.254/22,意思也是前22位是網絡位址。
- 問題2:劃分 網絡位址 + 主機位址 的意義是什麼?
網絡位址相同的IP,也稱為屬于同一個網段。
在區域網路内隻有同一個網段的IP才能互相通信,不同網段IP想要通信需要借助路由的轉發才能通信。
當了解子網路遮罩之後,其實就可以确定某個網段可以容納的主機個數,例如:
【IP: 192.168.10.2 掩碼:255.255.255.0】 和 【192.168.10.251 掩碼:255.255.255.0】 資料同一個網段。
示例網段的主機範圍:11000000.10101000.00001010. 00000001 ~ 11000000.10101000.00001010. 11111110
-------------------------- --------------------------
網絡位址 網絡位址
192.168.10.1 ~ 192.168.10.254
【IP: 192.168.8.1 掩碼:255.255.240.0】 和 【192.168.11.254 掩碼:255.255.240.0】 資料同一個網段。
子網路遮罩:255.255.240.0
示例網段的主機範圍:11000000.10101000.000010 00.00000001 ~ 11000000.10101000.000010 11.11111110
11111111.11111111.111111 00.00000000
------------------------ ------------------------
網絡位址 網絡位址
192.168.8.1 ~ 192.168.11.254
【IP: 192.168.96.1 掩碼:255.255.240.0】 和 【192.168.99.254 掩碼:255.255.240.0】 資料同一個網段。
示例網段的主機範圍:11000000.10101000.011000 00.00000001 ~ 11000000.10101000.011000 11.11111110
------------------------ ------------------------
網絡位址 網絡位址
192.168.96.1 ~ 192.168.99.254
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-mT35vLyp-1614517279929)(assets/image-20210207001644433.png)]
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-wBmxUAIy-1614517279930)(assets/image-20210207135331788.png)]
1.2.2 DHCP
在一個區域網路内想要給某台電腦組態設定IP有兩種方式:
- 手動設定,打開指定菜單欄在裡面輸入相應的IP資訊。
- 自動擷取
- 在電腦端,IP位址擷取方式設定為自動。
-
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-7F9Fu0g5-1614517279931)(assets/image-20210207143152690.png)]
1.2.3 内網和公網IP
一般情況下,内網IP都用這些(潛規則):
- 10.0.0.0 到 10.255.255.255
- 172.16.0.0 到172.31.255.255
- 192.168.0.0 到192.168.255.255
之前我們自己在一個區域網路内為電腦組態設定的IP都稱為
内網IP
,基于内網IP可以在一個區域網路内進行互相通信(也需要相關的配置)。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-jB6rEUlL-1614517279931)(assets/image-20210207211646642.png)]
如果想要通過網際網路進行通信,就必須借助公網IP。例如,右邊家庭電腦想通路左邊某公司伺服器上的部署的網站:
- 第一步:左邊公司,去營運商申請公網的固定IP(辦理專線寬帶時營運商會配置設定至少1個固定的IP位址),其實營運商就是将你拉的這個專線和固定IP建立綁定關系。(假設公網IP:123.206.15.88)
- 第二步:配置公網IP與指定伺服器的轉發規則。
- 第二步:右邊家庭,如果想要通路某個公司伺服器上的網網站,隻需要執行指定IP:123.206.15.88,營運商就會根據IP找到與之關聯的公司專線,并通過公司路由器、防火牆等裝置找到指定的伺服器。
按理說,每個從營運商接入網的使用者都可以有一個外網IP,但由于全球使用者太多而IP根本就不夠配置設定,是以,營運商網絡會進行劃分,讓多個家庭寬帶使用者共用一個公網IP(動态,可能每次上網公網IP都不一樣)。
讓家庭使用者想要通過網絡通路通路其他IP時,先發給營運商由營運商向外轉發到其他IP。
注意:外部使用者想要通路家庭寬帶的IP時,營運商不會把請求轉發到我們的電腦。
是以,以後如果你想開發一個網站供全球的使用者通路,那你就需要做以下幾件事:
- 拉專線,申請固定公網IP
- 買一台伺服器(就是性能好的電腦)
- 公網IP綁定至此伺服器
- 将寫好的代碼放在伺服器上并運作起來
這樣就可以搞定了…
擴充:IPv4和IPv6
IPv4,長度為 32 位(4 個位元組), 格式:A.B.C.D
IPv6,長度為 128 位(16 個位元組),用":"分成8段,格式:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX(每個X是一個16進制數)。
1.2.4 雲伺服器
大家可能之前聽說過:阿裡雲、騰訊雲、亞馬遜aws等之類的平台都在搞雲伺服器,那是個啥?
簡單的說:他們造了一個機房(網吧),買了很多很多的伺服器(高性能電腦),然後将他們放在機房,然後通電+通網,主要對外去租賃這些伺服器資源,讓使用者不必再自己 拉專線+配置網絡+買伺服器。
假設,你想要在騰訊雲租一台伺服器,就可以根據自己的需求去選擇配置,騰訊雲會根據配置在他的實體機上虛拟出一個伺服器,并進行相應的環境初始化并綁定公網固定IP,這樣你就可以快速擁有一台可以被大家通路的伺服器了。
注意:一台性能非常高的實體機虛拟出很多虛拟機,類似于你在自己電腦上通過vmware、parallel等搞出多個虛拟機。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-nPWao7tK-1614517279933)(assets/image-20210207215523168.png)]
1.2.5 端口
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-AnWkPbOR-1614517279934)(assets/image-20210207221334711.png)]
假設,你在騰訊租了一台雲伺服器(外網IP:123.206.15.88),然後又開發了 2 個網站運作在伺服器上。
那麼問題來了,使用者在自己的電腦或手機上如何來分别通路同一台伺服器上兩個程式呢?
其實,在計算機中有一個
端口
的概念,每個程式想要通過網絡進行通訊都必須要指定一個端口,例如:
- 網站A:使用8001端口,那麼使用者在自己電腦上或手機上通路時指定 IP和端口 即可,如:
123.206.15.88:8001
- 網站B:使用8002端口,那麼使用者在自己電腦上或手機上通路時指定 IP和端口 即可,如:
123.206.15.88:8002
注意:端口的取值範圍:0 ~ 65535,很多端口在計算機的内部已被使用,我們平時自定義時盡量選擇5000之後的端口。
示例:通路百度
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-lBKOCoGZ-1614517279935)(assets/image-20210207230929229.png)]
提示:如果在浏覽器上隻寫IP不寫端口,則預設是80端口。
1.2.6 域名
假設你創業開發了一個網站,使用者很難記住你的公網IP:
123.206.15.88:80
``123.206.15.88`。
是以,域名就誕生了,讓域名和IP建立對應關系,使用者隻需要記住域名就可以了,例如:
www.baidu.com --> 110.242.68.3
www.taobao.com --> 121.18.239.232
...
注意:域名隻是和IP建立了對應關系,與端口無關
www.baidu.com:80
。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-yvqbovxA-1614517279936)(assets/image-20210207221334711.png)]
在使用者在自己的電腦或手機上輸入域名去通路時,其實要執行兩個步驟:
- 根據域名尋找IP。(尋找IP)
- 獲得IP之後,再通過IP再去通路指定伺服器。
在電腦上屬如域名後,尋找IP的過程如下:
- 第一步:在自己電腦的DNS緩存記錄中尋找 域名對應的IP,如果未命中,則執行下一步。
- 第二步:在自己電腦的hosts檔案中尋找,如果未命中,則執行下一步。
- mac系統:/etc/hosts 檔案中
- win系統:C:\Windows\System32\drivers\etc\hosts 檔案中
# 内容示例
127.0.0.1 localhost
255.255.255.255 broadcasthost
127.0.0.1 kubernetes.docker.internal
192.168.1.55 www.pythonav.com
-
第三步:在自己電腦上找到DNS配置的位址(本地域名伺服器),去這個位址尋找域名對應的IP,如果未命中,則執行下一步。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-FcbkUHfH-1614517279936)(assets/image-20210207233253951.png)]
常見的DNS伺服器位址:
114.114.114.114(114 DNS)
223.5.5.5(阿裡 AliDNS)
8.8.8.8(Google DNS,随着Google在中國的沒落和國内官方的限制,已經不是太好用了)
...
各大營運商也有相應的DNS伺服器...
-
第四步:去根域名伺服器中詢問(全球共13台根域名伺服器,距離中國最近的一台是在日本)
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-qEbq6gI4-1614517279937)(assets/image-20210208102929953.png)]
問題來了
了解域名是怎麼回事之後?現在你如果想要讓自己的網站通過域名來通路,應該怎麼辦呢?【目前了解即可】
- 租一個域名
ICANN,域名的總管理者(美國一個非營利機構),它僅制定域名政策,注冊業務它會授權給一些頂級注冊商。
頂級注冊商,可以對外銷售域名,但要受國家 網際網路絡資訊中心的管理。例如:中國萬網(阿裡雲收購),中國新網,新網互聯,商務中國,中國頻道等。
代理注冊商,頂級注冊上可以再招一些代理幫助他們賣域名。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-pu7yMV0g-1614517279937)(assets/image-20210208110607388.png)]
- 備案
現在國内注冊域名後,需要進行備案(送出一些網站、個人或企業 等資訊)後才能使用。
注冊成功後,可按照引導備案:https://beian.aliyun.com/
注意:國外的域名無需備案就能使用。
- 域名解析
讓域名和IP建立關聯關系,并将關系同步到相關:本地域名伺服器 和 根域名伺服器(含頂級和二級域名伺服器)。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-sC592EJ4-1614517279938)(assets/image-20210208110829796.png)]
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-A6AzpULe-1614517279939)(assets/image-20210208110938038.png)]
2. 網絡程式設計
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-nuPtf0e3-1614517279940)(assets/image-20210207221334711.png)]
Python中内置了一個socket子產品,可以快速實作網絡之間進行傳輸資料。例如:
- 服務端,放在左邊雲伺服器中(有固定IP)
import socket
# 1.監聽本機的IP和端口
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('123.206.15.88', 8001)) # IP,端口
sock.listen(5) # 支援排隊等待5人
while True:
# 2.等待,有人來連接配接(阻塞)
conn, addr = sock.accept() # 等待用戶端來連接配接(阻塞)
# 3.等待,連接配接者發送消息(阻塞)
client_data = conn.recv(1024) # 等待接收用戶端發來資料
print(client_data.decode('utf-8')) # 位元組
# 4.給連接配接者回複消息
conn.sendall("hello world".encode('utf-8'))
# 5.關閉連接配接
conn.close()
# 6.停止服務端程式
sock.close()
- 用戶端,放在右邊使用者電腦上
import socket
# 1. 向指定IP發送連接配接請求
client = socket.socket()
client.connect(('123.206.15.88', 8001)) # 向服務端發起連接配接(阻塞)10s
# 2. 連接配接成功之後,發送消息
client.sendall('hello'.encode('utf-8'))
# 3. 等待,消息的回複(阻塞)
reply = client.recv(1024)
print(reply)
# 4. 關閉連接配接
client.close()
上述示例需要借助于網際網路,你至少需要租一台雲伺服器才能通信。
為了節省學習成本,大家可以在自己電腦上模拟【服務端】和【用戶端】,等以後項目開發完畢後,再租伺服器并部署到伺服器上。
注意:在自己本地運作上述代碼時,要監聽和連接配接時的IP位址。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-4jq1OLJx-1614517279941)(assets/image-20210208164809572.png)]
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-tThvaRXz-1614517279942)(assets/image-20210221190543727.png)]
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-aKVhJpjp-1614517279942)(assets/image-20210221190426551.png)]
當然,你也可以把在自己的區域網路内找兩台電腦,A作為服務端,B作為用戶端,這樣兩者也可以通信。
服務端的代碼需修改:監聽的IP修改為A的IP位址。
用戶端的代碼需修改:連接配接的IP修改為A的IP位址(用戶端要去找到服務端,并與服務端建立連接配接)。
注意事項:
- 本機:
服務端IP:127.0.0.1 / 192.168.28.92(區域網路IP)
- 區域網路:
服務端IP:192.168.28.92(區域網路IP)
- 網際網路
服務端IP:123.206.15.88(外網IP)
案例:智障客服
- 服務端
import socket
# 1.監聽本機的IP和端口
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 8001)) # 127.0.0.1 或 檢視自己區域網路本地IP位址
sock.listen(5)
while True:
# 2.等待,有人來連接配接(阻塞)
conn, addr = sock.accept()
print("有人來連接配接了...")
# 3.連接配接成功後立即發送
conn.sendall("歡迎使用xx系統,請輸入您想要辦理的業務!".encode("utf-8"))
while True:
# 3.等待接受資訊
data = conn.recv(1024)
if not data:
break
data_string = data.decode("utf-8")
# 4.回複消息
conn.sendall("你說啥?".encode("utf-8"))
print("斷開連接配接了")
# 5.關閉與此人的連接配接
conn.close()
# 6.停止服務端程式
sock.close()
- 用戶端
import socket
# 1. 向指定IP發送連接配接請求
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8001))
# 2.連接配接成功後,擷取系統登入資訊
message = client.recv(1024)
print(message.decode("utf-8"))
while True:
content = input("請輸入(q/Q退出):")
if content.upper() == 'Q':
break
client.sendall(content.encode("utf-8"))
# 3. 等待,消息的回複
reply = client.recv(1024)
print(reply.decode("utf-8"))
# 關閉連接配接,關閉連接配接時會向服務端發送空資料。
client.close()
案例:檔案上傳
- 服務端
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 8001)) # 127.0.0.1 或 檢視自己區域網路本地IP位址
sock.listen(5)
conn, addr = sock.accept()
# 接收檔案大小
data = conn.recv(1024)
total_file_size = int(data.decode('utf-8'))
# 接收檔案内容
file_object = open('xxx.png', mode='wb')
recv_size = 0
while True:
# 每次最多接收1024位元組
data = conn.recv(1024)
file_object.write(data)
file_object.flush()
recv_size += len(data)
# 上傳完成
if recv_size == total_file_size:
break
# 接收完畢,關閉連接配接
conn.close()
sock.close()
- 用戶端
import time
import os
import socket
client = socket.socket()
client.connect(('127.0.0.1', 8001))
file_path = input("請輸入要上傳的檔案:")
# 先發送檔案大小
file_size = os.stat(file_path).st_size
client.sendall(str(file_size).encode('utf-8'))
print("準備...")
time.sleep(2)
print("開始上傳..")
file_object = open(file_path, mode='rb')
read_size = 0
while True:
chunk = file_object.read(1024) # 每次讀取1024位元組
client.sendall(chunk)
read_size += len(chunk)
if read_size == file_size:
break
client.close()
3. B/S和C/S架構
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-2D6N7hN7-1614517279943)(assets/image-20210207221334711.png)]
- C/S架構,是Client和Server的簡稱。開發這種架構的程式意味着你即需要開發用戶端也需要開發服務端。
例如:你電腦的上QQ、百度網盤、釘釘、QQ音樂 等安裝在電腦上的軟體。
服務端:網際網路公司會開發一個程式放在他們的伺服器上,用于給用戶端提供資料支援。
用戶端:大家在電腦安裝的相關程式,内部會連接配接服務端進行收發資料并提供 互動和展示的功能。
- B/S架構,是Browser和Server的簡稱。開發這種架構的程式意味着你開發服務端即可,用戶端用使用者電腦上的浏覽器來代替。
例如:淘寶、京東等網站。
服務端:網際網路公司開發一個網站,放在他們的伺服器上。
用戶端:不需要開發,用現成的浏覽器即可。
總結
- 了解常見裝置和網絡架構。
- 掌握常見網絡詞彙的意思。
- 了解B/S和C/S架構的差別。
- 基于Python的socket子產品實作網絡程式設計。
作業
- 簡述 二層交換機 & 路由器 & 三層交換機 的作用。
- 簡述常見詞:IP、子網路遮罩、DHCP、公網IP、端口、域名的作用。
- 實作遠端使用者認證系統。
用戶端:
1. 運作程式,連接配接服務端并擷取服務端發送的歡迎使用xx系統資訊。
2. 輸入使用者名和密碼,并将使用者名和密碼發送到服務端去校驗。
3. 登入失敗,重試(Q退出)。
4. 登入成功,進入系統,提示登入成功
服務端:
1. 用戶端連接配接上服務端,傳回 歡迎使用xx系統資訊。
2. 等待用戶端發送使用者名和密碼進行校驗(使用者名和密碼在檔案中)
3. 登入失敗,傳回錯誤資訊。
4.