Python下web服務(wù)器的原始實(shí)現(xiàn)(socket實(shí)現(xiàn))

原始實(shí)現(xiàn)VS框架實(shí)現(xiàn)


“掌握一個(gè)類似于框架的高級(jí)工具是有用的界睁,但是基礎(chǔ)的東西可以讓你永遠(yuǎn)不被淘汰。不要被工具限制了自己的發(fā)展彻亲。

”在當(dāng)今Python服務(wù)器框架 (framework, 比如Django, Twisted, web.py等等) 橫行的時(shí)代孕锄,從底層的socket開始寫服務(wù)器似乎是一個(gè)出力不討好的笨方法。

“框架的意義在于掩蓋底層的細(xì)節(jié)苞尝,提供一套對(duì)于開發(fā)人員更加友好的API畸肆,并處理諸如MVC的布局問(wèn)題≈嬷罚框架允許我們快速的構(gòu)建一個(gè)成型而且成熟的Python服務(wù)器轴脐。然而,框架本身也是依賴于底層(比如socket)。對(duì)于底層socket的了解大咱,不僅可以幫助我們更好的使用框架恬涧,更可以讓我們明白框架是如何設(shè)計(jì)的。

更進(jìn)一步碴巾,

”如果擁有良好的底層socket編程知識(shí)和其他系統(tǒng)編程知識(shí)溯捆,你完全可以設(shè)計(jì)并開發(fā)一款自己的框架。如果你可以從底層socket開始厦瓢,實(shí)現(xiàn)一個(gè)完整的Python服務(wù)器提揍,支持用戶層的協(xié)議,并處理好諸如MVC(Model-View-Control)煮仇、多線程(threading)等問(wèn)題碳锈,并整理出一套清晰的函數(shù)或者類,作為接口(API)呈現(xiàn)給用戶欺抗,你就相當(dāng)于設(shè)計(jì)了一個(gè)框架售碳。“

我們已經(jīng)看到:

許多成功的網(wǎng)站都是利用動(dòng)態(tài)語(yǔ)言(比如Python, Ruby或者PHP绞呈,比如twitter和facebook)快速開發(fā)贸人,在網(wǎng)站成功之后,將代碼轉(zhuǎn)換成諸如C和JAVA這樣一些效率比較高的語(yǔ)言佃声,從而讓服務(wù)器能更有效率的面對(duì)每天億萬(wàn)次的請(qǐng)求艺智。在這樣一些時(shí)間,底層的重要性圾亏,就遠(yuǎn)遠(yuǎn)超過(guò)了框架十拣。

預(yù)備知識(shí):TCP/IP和socket


我們需要對(duì)網(wǎng)絡(luò)傳輸,特別是TCP/IP協(xié)議和socket有一定的了解志鹃。socket是進(jìn)程間通信的一種方法 (參考Linux進(jìn)程間通信)夭问,它是基于網(wǎng)絡(luò)傳輸協(xié)議的上層接口。socket有許多種類型曹铃,比如基于TCP協(xié)議或者UDP協(xié)議(兩種網(wǎng)絡(luò)傳輸協(xié)議)缰趋。其中又以TCP socket最為常用。

socket接口是實(shí)際上是操作系統(tǒng)提供的系統(tǒng)調(diào)用陕见。
TCP socket與雙向管道(duplex PIPE)有些類似秘血,一個(gè)進(jìn)程向socket的一端寫入或讀取文本流,而另一個(gè)進(jìn)程可以從socket的另一端讀取或?qū)懭肫捞穑容^特別是灰粮,這兩個(gè)建立socket通信的進(jìn)程可以分別屬于兩臺(tái)不同的計(jì)算機(jī)。

所謂的TCP協(xié)議忍坷,就是規(guī)定了一些通信的守則粘舟,以便在網(wǎng)絡(luò)環(huán)境下能夠有效實(shí)現(xiàn)上述進(jìn)程間通信過(guò)程红柱。雙向管道(duplex PIPE)存活于同一臺(tái)電腦中,所以不必區(qū)分兩個(gè)進(jìn)程的所在計(jì)算機(jī)的地址蓖乘,而socket必須包含有地址信息,以便實(shí)現(xiàn)網(wǎng)絡(luò)通信韧骗。

一個(gè)socket包含四個(gè)地址信息: 兩臺(tái)計(jì)算機(jī)的IP地址和兩個(gè)進(jìn)程所使用的端口(port)嘉抒。IP地址用于定位計(jì)算機(jī),而port用于定位進(jìn)程 (一臺(tái)計(jì)算機(jī)上可以有多個(gè)進(jìn)程分別使用不同的端口)袍暴。

TCP Socket

TCP socket


在互聯(lián)網(wǎng)上些侍,我們可以讓某臺(tái)計(jì)算機(jī)作為服務(wù)器。服務(wù)器開放自己的端口政模,被動(dòng)等待其他計(jì)算機(jī)連接岗宣。當(dāng)其他計(jì)算機(jī)作為客戶,主動(dòng)使用socket連接到服務(wù)器的時(shí)候淋样,服務(wù)器就開始為客戶提供服務(wù)耗式。

在Python中,我們使用標(biāo)準(zhǔn)庫(kù)中的socket包來(lái)進(jìn)行底層的socket編程趁猴。
socket類型和函數(shù)詳情請(qǐng)參見: Socket 類型 函數(shù)

首先是服務(wù)器端:
我們使用bind()方法來(lái)賦予socket以固定的地址和端口刊咳,并使用listen()方法來(lái)被動(dòng)的監(jiān)聽該端口。當(dāng)有客戶嘗試用connect()方法連接的時(shí)候儡司,服務(wù)器使用accept()接受連接娱挨,從而建立一個(gè)連接的socket:

import socket

# Address
HOST = ''
PORT = 8000

reply = 'Yes'

# 創(chuàng)建套接字,綁定套接字到本地IP與端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
# passively wait, 3: maximum number of connections in the queue
s.listen(3)

# accept and establish connectionconn, 
addr = s.accept()

# receive message
request = conn.recv(1024)
print 'request is: ',request
print 'Connected by', addr

# send message
conn.sendall(reply)

# close connection
conn.close()

將以上保存為文件org_ser.py

其次捕犬,客戶端:我們主動(dòng)使用connect()方法來(lái)搜索服務(wù)器端的IP地址和端口跷坝,以便客戶可以找到服務(wù)器,并建立連接碉碉。

import socket

# Address
HOST = '172.20.202.155'
PORT = 8000

request = 'can you hear me?'

# configure socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

# send message
s.sendall(request)

# receive message
reply = s.recv(1024)
print 'reply is: ',reply

# close connection
s.close()

客戶端保存為org_client.py

調(diào)試運(yùn)行:

20170110-1.JPG

左上角是用瀏覽器對(duì)服務(wù)器進(jìn)行訪問(wèn)的結(jié)果柴钻,服務(wù)器回傳了“Yes”,對(duì)應(yīng)服務(wù)器中的代碼:reply = 'Yes'垢粮。

中間圖是服務(wù)器運(yùn)行圖顿颅,最下面是客戶端運(yùn)行圖,可以看出客戶端向服務(wù)器請(qǐng)求的內(nèi)容為:request = 'can you hear me?'足丢,而客戶端得到的反饋是“Yes”橡娄。

程序運(yùn)行正常。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末越锈,一起剝皮案震驚了整個(gè)濱河市炒瘸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柬批,老刑警劉巖啸澡,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異氮帐,居然都是意外死亡嗅虏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門上沐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)皮服,“玉大人,你說(shuō)我怎么就攤上這事参咙×涔悖” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蕴侧,是天一觀的道長(zhǎng)择同。 經(jīng)常有香客問(wèn)我,道長(zhǎng)净宵,這世上最難降的妖魔是什么敲才? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮择葡,結(jié)果婚禮上归斤,老公的妹妹穿的比我還像新娘。我一直安慰自己刁岸,他們只是感情好脏里,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虹曙,像睡著了一般迫横。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酝碳,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天矾踱,我揣著相機(jī)與錄音,去河邊找鬼疏哗。 笑死呛讲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的返奉。 我是一名探鬼主播贝搁,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼芽偏!你這毒婦竟也來(lái)了雷逆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤污尉,失蹤者是張志新(化名)和其女友劉穎膀哲,沒(méi)想到半個(gè)月后往产,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡某宪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年仿村,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兴喂。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔼囊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瞻想,到底是詐尸還是另有隱情,我是刑警寧澤娩嚼,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布蘑险,位于F島的核電站,受9級(jí)特大地震影響岳悟,放射性物質(zhì)發(fā)生泄漏佃迄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一贵少、第九天 我趴在偏房一處隱蔽的房頂上張望呵俏。 院中可真熱鬧,春花似錦滔灶、人聲如沸普碎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)麻车。三九已至,卻和暖如春斗这,著一層夾襖步出監(jiān)牢的瞬間动猬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工表箭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赁咙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓免钻,卻偏偏與公主長(zhǎng)得像彼水,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子极舔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一: 網(wǎng)絡(luò)各個(gè)協(xié)議:TCP/IP猿涨、SOCKET、HTTP 網(wǎng)絡(luò)七層由下往上分別為物理層姆怪、數(shù)據(jù)鏈路層叛赚、網(wǎng)絡(luò)層澡绩、傳輸層...
    iYeso閱讀 1,436評(píng)論 0 13
  • 網(wǎng)絡(luò)概念第一天 兩臺(tái)電腦怎么通過(guò)網(wǎng)絡(luò)傳輸數(shù)據(jù)?怎樣才能知道傳輸?shù)氖菙?shù)據(jù)俺附?誰(shuí)摸過(guò)網(wǎng)線肥卡? 看電影,怎么看的事镣?通過(guò)電流步鉴,...
    小吖朱閱讀 1,555評(píng)論 0 1
  • 一、網(wǎng)絡(luò)各個(gè)協(xié)議:TCP/IP璃哟、SOCKET氛琢、HTTP等 網(wǎng)絡(luò)七層由下往上分別為物理層、數(shù)據(jù)鏈路層随闪、網(wǎng)絡(luò)層阳似、傳輸層...
    杯水救車薪閱讀 2,266評(píng)論 0 17
  • Posted by 微博@Yangsc_o [http://weibo.com/yangsanchao] 原創(chuàng)文章...
    機(jī)器學(xué)習(xí)架構(gòu)閱讀 32,764評(píng)論 85 592
  • 文 / 長(zhǎng)木云伊 一年多沒(méi)游過(guò)泳,昨天去游了大概一百米铐伴,休息了兩次撮奏,渾身酸疼的像是被人揍了一頓。帶著腿当宴、胳膊畜吊、胸與...
    莫嗔堂堂主閱讀 305評(píng)論 0 2