【re:從零開始的網(wǎng)站搭建教程】#1-基礎(chǔ)知識
#引言
均為我個人經(jīng)驗,且都由我個人編寫完成,如有錯誤請見諒。
本文將講解用原生python編寫web服務、基礎(chǔ)的網(wǎng)絡連接、http協(xié)議、以及html+js+css前端語言,而不會使用現(xiàn)成的web框架、建站腳本。也會提及本人之前遇到的問題和一些坑。我們的最終目標是用這些知識搭建一個完整的論壇。
——閱讀本文需要有一定的計算機知識。若能使用python最好,在代碼演示的時候會用到。
推薦python教程:
【Python教程 - 廖雪峰的官方網(wǎng)站】https://www.liaoxuefeng.com/wiki/1016959663602400
#http基礎(chǔ)
我們?yōu)g覽網(wǎng)頁,與web服務器通信建立在tcp/ip協(xié)議之上。不過這并非我們的重點,我們不需要了解tcp連接具體是如何建立的,只用知道于訪問網(wǎng)站需要tcp/ip協(xié)議。而真正的重點是http協(xié)議,我們需要了解在http協(xié)議下訪問一個網(wǎng)站的流程。

是非常簡單的一去一來,http協(xié)議規(guī)定我們訪問網(wǎng)站都要遵循這個流程。要注意的是雖然tcp協(xié)議允許了服務器和客戶端之間數(shù)據(jù)雙向自由傳輸,但是http協(xié)議規(guī)定連接只能由客戶端也就是用戶這邊的瀏覽器發(fā)起,服務器只能根據(jù)客戶端發(fā)送的數(shù)據(jù)進行響應,并且當服務器發(fā)送完信息后會立即關(guān)閉連接。
#socket、ip與端口
1.socket
socket即套接字,在編程語言中是對網(wǎng)絡連接的抽象。通過操控socket對象可以對網(wǎng)絡連接進行各種操作。
2.ip
ip是網(wǎng)絡上的一個地址,有公網(wǎng)ip與內(nèi)網(wǎng)ip之分,簡單來說的話公網(wǎng)ip是能在互聯(lián)網(wǎng)上訪問的ip,而內(nèi)網(wǎng)ip只能在局域網(wǎng)中訪問,家庭網(wǎng)絡中大多是以192.168開頭的內(nèi)網(wǎng)ip。
由于目前的ipv4的ip地址有限,最多也就只有256^4個(0.0.0.0~255.255.255.255),給每個設(shè)備都綁定ipv4地址是不現(xiàn)實的,我們平時使用的都是動態(tài)ip,這也是服務器沒辦法主動請求的原因。
在cmd中使用
即可查看自己當前的本地ip地址。

另外,在搜索引擎中輸入ip就可已查詢本機當前在外網(wǎng)上的ip地址。
當然如果非要連網(wǎng)才能編寫的話未免也過于麻煩,我們可以使用ipv4環(huán)回來解決這個問題。ipv4環(huán)回是一個特殊的ip,其地址為127.0.0.1。通過這個地址我們可以讓主機給自身發(fā)送數(shù)據(jù)。
3.端口
而端口則代表這個地址上的眾多出入口。端口一共有65536個(即2^16),很多網(wǎng)絡協(xié)議都會有固定端口,http協(xié)議一般使用80端口。
#python TCP網(wǎng)絡編程與多線程
1.TCP網(wǎng)絡編程
使用python自帶socket模塊來進行tcp網(wǎng)絡編程
s就是我們的一個新的socket對象了,AF_INET表示使用ipv4,要使用ipv6的話用AF_INET6就可以了。SOCK_STREAM表示使用面向流的TCP協(xié)議。
接下來就是對s進行各種操作。
如果作為客戶端的話就比較簡單,就只需要連接,然后發(fā)送、接受數(shù)據(jù),最后關(guān)閉就行了
服務端會稍微復雜一點,服務端需要監(jiān)聽客戶端的請求、接收發(fā)送數(shù)據(jù),并且還要能同時和多個客戶端進行連接。
2.多線程
要同時完成幾個任務就需要用到多線程,雖然python因為GIL鎖的原因不能很好的利用多核cpu,但由于web是io密集型,對計算的要求相對來說不是非常大,在這種情況下python的多線程還是很好用的。
用來個簡單的客戶端與服務端的通信示例
服務端:
客戶端:
效果是這樣的


下一節(jié)就真正開始講web框架的編寫。