日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

看问题要看到本质:从Web服务器说起

發(fā)布時間:2025/3/21 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 看问题要看到本质:从Web服务器说起 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這是個很長的故事, 讓我們從Web服務(wù)器來開始。

Web服務(wù)器是個挺簡單的東西,工作很簡單,在80端口上監(jiān)聽,解析客戶端發(fā)過來的HTTP的請求, 然后把相對應(yīng)的HTML文件、Image等返回給客戶端就可以了。?像這樣:

?

這就是一個靜態(tài)內(nèi)容服務(wù)器,所謂靜態(tài)內(nèi)容,就是服務(wù)器端的內(nèi)容如HTML不會變化,每次請求都是一樣的。除非人們手工改了它。

實(shí)現(xiàn)這樣一個“玩具Web服務(wù)器”并不難,只要能了解服務(wù)器端Socket編程就可以了, 主要工作是編程處理HTTP協(xié)議的細(xì)節(jié)。

動態(tài)內(nèi)容

但是如果想再往前走一步,讓W(xué)eb服務(wù)器能產(chǎn)生動態(tài)內(nèi)容,那就難了。

比如說來了一個HTTP請求,在其中攜帶者用戶名和密碼,要求你去數(shù)據(jù)庫做一個查詢,看看用戶是否存在。

POST ?/login

user=xxxx&pwd=xxx

這個靜態(tài)的Web服務(wù)器就搞不定了,它根本,也不應(yīng)該去查詢數(shù)據(jù)庫。

怎么辦呢?你可以用某種語言(比如C語言)寫個程序, 來查詢數(shù)據(jù)庫,假設(shè)這個程序的名字叫db-query。

可是你將面對非常棘手的問題:??Web服務(wù)器是個進(jìn)程,db-query也是個進(jìn)程,這倆貨之間怎么通信呢?

(友情提示,下面內(nèi)容略顯枯燥,可跳過)

首先是參數(shù)的傳遞,一種辦法是這樣:對于每個動態(tài)請求,Web服務(wù)器進(jìn)程創(chuàng)建一個db-query的子進(jìn)程,然后通過環(huán)境變量把參數(shù)傳遞過去。

web服務(wù)器:

setenv("QUERY_STRING","user=xxxx&pwd=xxx")

db-query子進(jìn)程 :

param = getenv("QUERY_STRING")。

下一個問題:db-query這個子進(jìn)程獲得了用戶名和密碼,查詢了數(shù)據(jù)庫,怎么把查詢結(jié)果返回給瀏覽器?

有個很巧妙的辦法!

每個程序都有所謂的標(biāo)準(zhǔn)輸出(STDOUT),db-query只要調(diào)用printf這個函數(shù),數(shù)據(jù)就會輸出到STDOUT,我們就可以在黑乎乎的控制臺上看到了數(shù)據(jù)輸出了。

但是輸出到控制臺是萬萬不行的,我們得輸出到socket才可以發(fā)回瀏覽器。

每個瀏覽器和服務(wù)器的連接都是一個Socket, 每個socket都有一個文件描述符fd, 如果把查詢數(shù)據(jù)庫程序db-query的STDOUT重定向到那個fd,會發(fā)生什么?

沒錯!db-query的所有輸出都直接發(fā)送的客戶端的socket了,Web服務(wù)器可以撒手不管了!

當(dāng)然,如果瀏覽器要看到的是HTML頁面, 那db-query這個程序就需要輸出HTML了。

?

這種方式就就是大名鼎鼎的CGI,當(dāng)你看到網(wǎng)址中有cgi-bin字樣的時候,很有可能就是用CGI實(shí)現(xiàn)的。? 只要遵循CGI協(xié)議, 可以用任何語言來實(shí)現(xiàn)動態(tài)的網(wǎng)站。

這是人類邁出的一大步,有了這一步,才能在網(wǎng)上購物,辦公,社交,聊天...... ?你才能看到我這篇文章(嗯,也許騰訊把微信公眾號的文章都靜態(tài)化了, 請了解詳情的同學(xué)告知)

但是,CGI是非常復(fù)雜和笨拙的, 主要體現(xiàn)在:

第一,對每個請求,都得創(chuàng)建一個子進(jìn)程去執(zhí)行,這是個非常大的開銷。

第二,對程序員來說,編程極為痛苦,要操作環(huán)境變量,還需要直接在編程語言中輸出HTML!

麻煩不麻煩,難受不難受,上個世紀(jì)的程序員苦逼不苦逼?

?

Servlet

怎么才能跳出苦海?必須得做到關(guān)注點(diǎn)的分離!

程序員的關(guān)注點(diǎn)是:拿到Http 請求中的數(shù)據(jù),執(zhí)行業(yè)務(wù), 然后輸出Http 響應(yīng)。?別的什么環(huán)境變量,重定向,別來煩我!

那就簡單了,讓程序員寫個類,里邊是業(yè)務(wù)邏輯, 然后我們想辦法構(gòu)建一個HttpRequest對象和HttpResponse對象,傳遞給程序員的類讓他使用不就行了?

誰來創(chuàng)建這個HttpRequest和Response 對象, ?然后調(diào)用程序員寫的類?

靜態(tài)Web服務(wù)器表示我不愿意,我就想管好我這一畝三分地,把靜態(tài)內(nèi)容給大家服務(wù)好。

Tomcat已經(jīng)迫不及待地要上場了,我來我來。碼農(nóng)朋友們,我送給你們一個規(guī)范,叫Servlet, 你們按照Servlet的規(guī)范來寫程序,放到我這里運(yùn)行,別的什么都不用管了。

程序員很高興,只需要寫簡單的Servlet就行了,HttpRequest和HttpResponse對象由Tomcat來創(chuàng)建,可以從HttpRequest中獲得Header, Cookie, QueryString 等信息, 從HttpResponse中獲得輸出流,直接向?yàn)g覽器輸出結(jié)果, 簡單又直接。

?

Tomcat還鄭重向大家聲明:對于每個請求,我只會用一個線程來出來,線程的開銷可比進(jìn)程小多了。

對于那個在代碼中混雜HTML的問題怎么處理?

?Tomcat也有辦法, 可以在HTML混雜代碼!這就是JSP。執(zhí)行期其實(shí)會被編譯成Servlet。

(碼農(nóng)翻身注:請移步《JSP:一個裝配工的沒落》)

你看,責(zé)任分離了,每個人只要辦好自己的事情就好。

(注:實(shí)際上,我們不會在Servlet中寫業(yè)務(wù)邏輯, Servlet現(xiàn)在通常是一個通往框架的入口。)

WSGI

CGI表示不服:遵循我的協(xié)議,任何語言都可以來實(shí)現(xiàn)動態(tài)網(wǎng)站,你Servlet只是Java規(guī)范,不管別的語言了?

Servlet規(guī)范確實(shí)沒法跨語言實(shí)現(xiàn),那要是Python也想做動態(tài)Web網(wǎng)站,該怎么辦?

既然已經(jīng)認(rèn)識到動態(tài)網(wǎng)站的本質(zhì)了, 可以采用類似的思想來處理嘛!?我們?yōu)镻ython也定義一個規(guī)范,叫做WSGI?(Web Service Gateway Interface)。

讓程序員寫個類或者函數(shù)(稱為wsgi application),在其中實(shí)現(xiàn)邏輯。讓某個動態(tài)服務(wù)器(稱為wsgi server)把Http Request和Response傳遞給它,就可以執(zhí)行了。

但是Python表示:我不喜歡你們Java 那一套啰里啰嗦的類,HttpRequest 不就是一些key value嗎?放到我鐘愛的dict中多好 !我把它叫做enviroment, HttpResponse也沒必要,直接用函數(shù)的返回值(確切說是一個可迭代對象)就好。

看看,是不是和Java 的Servlet 很像?(當(dāng)然,忽略了很多細(xì)節(jié)。)

從本質(zhì)上來說,都是為了關(guān)注點(diǎn)的分離:

1. 用一個動態(tài)內(nèi)容服務(wù)器(wsgi server,Tomcat等)來接受并且封裝HTTP 請求,降低程序員的負(fù)擔(dān)。

2. 程序員只需要遵循約定(servlet,wsgi)就可以輕松實(shí)現(xiàn)自己的業(yè)務(wù),不用關(guān)注系統(tǒng)的處理細(xì)節(jié)。

如果你先學(xué)的Java,通過Servlet理解了動態(tài)內(nèi)容網(wǎng)站的本質(zhì)和解決問題思路,再看到Python的wsgi,一眼就能看透,學(xué)起來飛快,反過來也是如此。

Web服務(wù)器的例子還比較簡單,但是也體現(xiàn)出了這個道理:遇到問題要深度思考,努力看到本質(zhì),這樣才能舉一反三。

總結(jié)

以上是生活随笔為你收集整理的看问题要看到本质:从Web服务器说起的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 猛1被调教成公厕尿便失禁网站 | 免费黄色链接 | 午夜片在线观看 | 国产精品无码在线播放 | 日韩综合网站 | 一级肉体全黄毛片 | 国产中文在线视频 | 中文字幕va | 激情成人av| √8天堂资源地址中文在线 欧美精品在线一区二区 | 香蕉视频污在线观看 | 亚洲男人天堂网址 | 国产传媒在线播放 | 日一区二区三区 | v天堂中文在线 | 天堂网www在线 | 国产黄色免费大片 | 天天操天天射天天 | 老女人丨91丨九色 | 国产日韩视频 | 一区二区视频在线观看免费 | 在线中文字幕av | 欧美香蕉网 | av成人天堂 | 国产中文一区 | 丰满少妇一区 | 素人女裸体 | 亚洲第一综合网 | 日韩伊人久久 | 欧美日韩经典 | 成人免费视频国产免费 | 在线免费一区二区 | 免费av在线播放网址 | 亚洲成人h| 欧美日韩在线视频免费 | 欧美人妖老妇 | 视频在线日韩 | 成人性生交大片免费看96 | 成人黄色在线 | 男人的网站在线观看 | 黄色片亚洲 | 日韩免费av在线 | 久久久久草 | 欧洲一区二区三区四区 | 国产男女猛烈无遮挡a片漫画 | 免费精品视频在线 | 国产小视频在线免费观看 | 91精品一区二区 | 国产精品福利影院 | 日本福利视频一区 | 一区二区三区在线免费 | 青青草一区 | 国产69精品久久 | 欧美色xxxx| 看了让人下面流水的视频 | 无码人妻aⅴ一区二区三区 国产高清一区二区三区四区 | 超碰成人福利 | 亚洲精品高清在线观看 | 无码人妻aⅴ一区二区三区有奶水 | 性av免费 | 日韩亚洲国产欧美 | 日韩久久一区 | 97在线视频免费观看 | 精品视频无码一区二区三区 | 国产又粗又猛又爽又黄的 | 香蕉小视频| 中文字幕8 | 久精品在线观看 | 清纯唯美亚洲综合 | 婷婷精品一区二区三区 | 色人天堂 | 噜噜色综合 | 樱花动漫无圣光 | 一级少妇毛片 | 91av国产精品 | 亚洲欧美日韩成人 | 久久视频99| 成人免费短视频 | 免费看黄在线 | 亚洲国产成人精品视频 | 中文字幕一区二区视频 | 日韩三级在线播放 | 国产欧美视频在线播放 | 亚洲日日操| 午夜精品一区二区三区在线视频 | 麻豆影片| 中文字幕视频二区 | 热久久久久 | 夜夜艹| 91精品91 | 亚洲精品资源在线 | 超碰91在线 | 国产主播在线播放 | 户外露出一区二区三区 | 中文字幕有码在线播放 | 亚洲爆爽| 国产午夜精品一区二区三区嫩草 | 另类综合视频 | www.桃色av嫩草.com |