最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于HTTP協(xié)議實(shí)現(xiàn)的小型web服務(wù)器的方法

 更新時(shí)間:2020年04月23日 14:58:40   作者:Y-ANG  
這篇文章主要介紹了基于HTTP協(xié)議實(shí)現(xiàn)的小型web服務(wù)器的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

我們先了解一下這個(gè)項(xiàng)目最終能達(dá)到的一個(gè)目標(biāo),然后以這個(gè)來進(jìn)行項(xiàng)目的分析:
1、實(shí)現(xiàn)最基本的HTTP/1.0版本的web服務(wù)器,客戶端能夠使用GET、POST方法請(qǐng)求資源
2、服務(wù)器將客戶請(qǐng)求的資源以html頁面的形似呈現(xiàn),并能夠進(jìn)行差錯(cuò)處理(如:客戶請(qǐng)求的資源不存在時(shí),服務(wù)器能夠返回一個(gè)404的頁面)
3、服務(wù)器能進(jìn)行簡單的cgi運(yùn)行。比如當(dāng)客戶在表單中輸入數(shù)據(jù)后,服務(wù)器能夠?qū)⑦\(yùn)行結(jié)果返回個(gè)客戶
4、能夠通過頁面對(duì)數(shù)據(jù)庫進(jìn)行操作,如增刪查改等操作

一、http服務(wù)器實(shí)現(xiàn)的基本框架

關(guān)于HTTP協(xié)議
即超文本傳輸協(xié)議,是互聯(lián)網(wǎng)上應(yīng)用最廣泛的網(wǎng)絡(luò)協(xié)議。它是應(yīng)用層的協(xié)議,底層是基于TCP通信的。HTTP協(xié)議的工作過程:客戶通過瀏覽器向服務(wù)器發(fā)送文檔請(qǐng)求,瀏覽器將請(qǐng)求的資源回應(yīng)給瀏覽器,然后關(guān)閉連接。即:連接->請(qǐng)求->響應(yīng)->關(guān)閉連接。

關(guān)于URL
即統(tǒng)一資源定位符,每個(gè)網(wǎng)頁都對(duì)應(yīng)一個(gè)URL地址(俗稱網(wǎng)址),具有全球唯一性。它包含的信息指出文件的位置以及瀏覽器應(yīng)該怎么處理它。 一個(gè)完整的URL包括協(xié)議類型、主機(jī)類型、路徑和文件名。
http協(xié)議的URL格式: http: //host[:port][abs_path] ,http表示使用http協(xié)議來進(jìn)行資源定位;host是主機(jī)域名;port是端口號(hào),一般有默認(rèn)的;abs_path代表資源的路徑。
這里我主要介紹項(xiàng)目中涉及的URL的兩種格式—URL帶參數(shù)和不帶參數(shù)的。

 

GET方法使用的是帶參數(shù)的URL,即傳遞的參數(shù)會(huì)使用?連接在資源路徑后邊;POST方法使用的是不帶參數(shù)的URL,它的參數(shù)是通過http請(qǐng)求報(bào)頭中的請(qǐng)求消息體傳遞給服務(wù)器的。

關(guān)于HTTP的請(qǐng)求與響應(yīng)格式

 

響應(yīng)報(bào)頭中的狀態(tài)碼和狀態(tài)碼描述,例如:當(dāng)請(qǐng)求的資源不存在時(shí),會(huì)收到“404 NotFound”的頁面,404就是狀態(tài)碼,“NotFound”就是狀態(tài)碼描述,即請(qǐng)求的文件不存在。

二、服務(wù)器實(shí)現(xiàn)的基本思路

1、http協(xié)議是基于TCP通信的協(xié)議,因此,實(shí)現(xiàn)web服務(wù)器的第一步至少要能實(shí)現(xiàn)兩個(gè)主機(jī)不同進(jìn)程之間的TCP通信。
2、接下來的部分就是比較主要的處理邏輯了,當(dāng)服務(wù)器收到請(qǐng)求后,首先應(yīng)該分析請(qǐng)求方法(因?yàn)閣eb服務(wù)器是要支持cgi的,但請(qǐng)求方法不同處理cgi也不同,這里我們只處理GET和POST方法)。
3、當(dāng)方法確定后,應(yīng)該拿到請(qǐng)求的URL,這一步是為了我們后邊能處理GET和POST方法的cgi(GET和POST的參數(shù)位置不同,GET的參數(shù)在URL中,POST的參數(shù)在請(qǐng)求正文中)
4、判斷資源是否存在,如果存在,判斷這個(gè)資源是一個(gè)目錄、普通文件還是一個(gè)可執(zhí)行程序。之前幾步我們已經(jīng)提取到URL以及參數(shù)。GET方法:如果沒有參數(shù),就直接將請(qǐng)求的資源返回(即進(jìn)入非cgi模式運(yùn)行);否則,進(jìn)入cgi模式內(nèi)部運(yùn)行;只要是POST方法就需要支持cgi:直接進(jìn)入cgi函數(shù)內(nèi)部運(yùn)行。

非cgi模式:
進(jìn)入非cgi模式時(shí)一定是GET方法且沒有參數(shù),此時(shí)進(jìn)入echo_www()函數(shù)內(nèi)部即可,該函數(shù)會(huì)將所請(qǐng)求的資源以html的格式返回給瀏覽器。

cgi模式:

 

上述這張圖描述了運(yùn)行cgi時(shí)的過程,首先服務(wù)器要從瀏覽器上讀取參數(shù),然后需要fork出一個(gè)子進(jìn)程進(jìn)行cgi部分的處理,父進(jìn)程通過環(huán)境變量的方式將參數(shù)轉(zhuǎn)交給子進(jìn)程,子進(jìn)程運(yùn)行完成后,將結(jié)果交給父進(jìn)程,父進(jìn)程再將數(shù)據(jù)輸出給瀏覽器。在這個(gè)過程中可以將父進(jìn)程看作一個(gè)所謂的中間量,只進(jìn)行了參數(shù)的轉(zhuǎn)交,因此可以將子進(jìn)程的輸入輸出文件描述符進(jìn)行重定向,即子進(jìn)程直接與瀏覽器“聯(lián)系”。

下面總結(jié)出父子進(jìn)程內(nèi)部各自需要干的事情:

三、錯(cuò)誤處理

錯(cuò)誤處理這部分的實(shí)現(xiàn)可以參考echo_www()函數(shù),但需要改變響應(yīng)的消息報(bào)頭的格式,即改變狀態(tài)碼,狀態(tài)碼描述,以及返回的頁面。例如當(dāng)請(qǐng)求的資源不存在時(shí),服務(wù)器需要返回給瀏覽器一個(gè)默認(rèn)的404頁面,告訴客戶請(qǐng)求的資源不存在。效果如圖:

四、項(xiàng)目文件

 

目錄:
cgi:運(yùn)行cgi部分的實(shí)現(xiàn)代碼
conf:配置文件,存放需要綁定的服務(wù)器的ip和port
log:shell的日志文件以及http錯(cuò)誤處理的日志文件
lib:mysql需要的lib庫
sql_client:mysql部分的API及CGI實(shí)現(xiàn)
wwwroot:web服務(wù)器工作的根目錄,包含各種資源頁面(例如默認(rèn)的index.html頁面,差錯(cuò)處理的404頁面),以及執(zhí)行cgi的可執(zhí)行程序

文件:
configure.sh:sheel腳本,運(yùn)行該shell腳本后需要自動(dòng)生成Makefile文件
http_ctl.sh:服務(wù)器控制腳本,需要實(shí)現(xiàn)服務(wù)器的啟動(dòng)、暫停以及重新啟動(dòng)
httpd.pid:與http_ctl.sh配合使用。如果把服務(wù)器變成守護(hù)進(jìn)程在后臺(tái)運(yùn)行,重新啟動(dòng)時(shí)就需要檢測服務(wù)器是否啟動(dòng),該文件存放服務(wù)器啟動(dòng)以后的進(jìn)程id
httpd.h:服務(wù)器的方法聲明
httpd.c:方法實(shí)現(xiàn)
main.c:服務(wù)器的主邏輯

五、實(shí)現(xiàn)結(jié)果

請(qǐng)求資源存在:

運(yùn)行cgi后:

六、源碼:

https://github.com/lybb/Linux/tree/master/httpd

附:
這里是我遇到的一些問題,粘出來,也可能是你遇到的問題:
1、本地環(huán)回測試ok,Linux下的瀏覽器測試也可以,但不能接外部的瀏覽器訪問(沒有設(shè)置橋接模式)嗯~要是在外部瀏覽器測試的話千萬別忘記關(guān)閉防火墻
2、服務(wù)器應(yīng)答時(shí),沒有將html格式的頁面發(fā)送,而是將底層的實(shí)現(xiàn)代碼展示在瀏覽器,并且在調(diào)試時(shí)將本來要打印的調(diào)試信息會(huì)打印到網(wǎng)頁上(在回應(yīng)空行時(shí)將send期望發(fā)送的數(shù)值寫的太大,本來只需要發(fā)送兩個(gè)字節(jié)的內(nèi)容)
解決:先檢查代碼,思路正確,在容易出現(xiàn)問題的地方加入調(diào)試信息,最后將問題定位在echo_www()函數(shù)內(nèi)
3、不能顯示圖片(這個(gè)問題是沒有將所有發(fā)送的情況考慮完全,只考慮到目錄、可執(zhí)行程序,但沒有考慮到如果請(qǐng)求的是一個(gè)路徑明確的普通文件)
解決:測試請(qǐng)求一個(gè)路徑明確的test.html文件,加入調(diào)試信息 ,將問題定位在:如果請(qǐng)求的資源存在,應(yīng)該如何處理。對(duì)于普通文件,找到后并回顯給瀏覽器;如果是目錄,應(yīng)答的是默認(rèn)頁面;如果是可執(zhí)行程序,執(zhí)行后返回結(jié)果
4、能顯示圖片后,但顯示的不完整(原因:echo_www中,期望讀取一行信息的line值太小,不能存下一張圖片)
5、運(yùn)行cgi模式時(shí),每次提交數(shù)據(jù)并進(jìn)行submit后都會(huì)自動(dòng)出現(xiàn)提醒下載的頁面
原因:在響應(yīng)報(bào)頭中,將Content-Type中的”text”寫成”test”。而瀏覽器對(duì)于不能識(shí)別或解析的實(shí)體,都會(huì)提醒用戶下載。

到此這篇關(guān)于基于HTTP協(xié)議實(shí)現(xiàn)的小型web服務(wù)器的方法的文章就介紹到這了,更多相關(guān)HTTP小型web服務(wù)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • win2003或linux服務(wù)器一般多久重啟一次

    win2003或linux服務(wù)器一般多久重啟一次

    得根據(jù)服務(wù)器的負(fù)載量來確定,數(shù)據(jù)量大的話,每次啟動(dòng)時(shí)間間隔就需要短些,反之就可以長一些.如果機(jī)器維護(hù)的比較好,啟動(dòng)時(shí)間間隔也可以延長些,只要客戶訪問速度不慢就好
    2012-03-03
  • 服務(wù)器重啟不能啟動(dòng)的幾種常見的解決方法

    服務(wù)器重啟不能啟動(dòng)的幾種常見的解決方法

    服務(wù)器重啟不能啟動(dòng)的幾種常見的解決方法,碰到此問題的朋友可以參考下。
    2011-04-04
  • 刀片服務(wù)器五大誤區(qū)解讀

    刀片服務(wù)器五大誤區(qū)解讀

    人總是愿意用挑剔的目光來看到新生事物,在對(duì)待刀片效勞器的問題就是如此,有些人對(duì)于一些反復(fù)介紹的技術(shù)視而不見,仍然強(qiáng)加給刀片效勞器一些莫須有的罪名,這些錯(cuò)誤正影響著刀片服務(wù)器的推廣和應(yīng)用。
    2009-09-09
  • DELL服務(wù)器RAID H700,PERC H800陣列卡配置中文完全手冊圖解

    DELL服務(wù)器RAID H700,PERC H800陣列卡配置中文完全手冊圖解

    這篇文章主要介紹了DELL服務(wù)器RAID H700,PERC H800陣列卡配置中文完全手冊圖解,供參考。疏漏之處敬請(qǐng)反饋
    2016-04-04
  • 微服務(wù)之注冊中心和配置中心Consul詳解

    微服務(wù)之注冊中心和配置中心Consul詳解

    這篇文章主要為大家介紹了微服務(wù) 注冊中心和配置中心Consul選型及基本使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 運(yùn)維的85條規(guī)則

    運(yùn)維的85條規(guī)則

    2007 年,時(shí)任虛擬世界游戲公司 Vivaty 運(yùn)維副總裁的 Jon Prall 在他的個(gè)人博客上發(fā)表過一篇《運(yùn)維的85條規(guī)則》。2010 年他跳槽到視頻電話公司 Tango 之初,做了兩處更新,茲翻譯如下
    2014-08-08
  • 服務(wù)器封UDP和封國外是什么意思? 封UDP和封海外云服務(wù)器選擇!

    服務(wù)器封UDP和封國外是什么意思? 封UDP和封海外云服務(wù)器選擇!

    很多人在租用高防云服務(wù)器的時(shí)候,都會(huì)看到關(guān)于防御會(huì)有介紹是否封國外、封UDP,封海外就是封住海外的攻擊,而封UDP則使UDP攻擊無效,所以防御上面封UDP的機(jī)器比不封UDP的要強(qiáng)一些,下面給大家簡單介紹一下封UDP和封國外是什么意思,有什么用
    2023-05-05
  • CentOs7搭建基于pptp的VPN服務(wù)器

    CentOs7搭建基于pptp的VPN服務(wù)器

    最近想遠(yuǎn)程連接一下家里的臺(tái)式機(jī)電腦,由于都是局域網(wǎng),又沒有公網(wǎng)ip,所以就沒法遠(yuǎn)程,上網(wǎng)查了一下,發(fā)現(xiàn)可以在云服務(wù)器上搭建一個(gè)VPN,這樣兩臺(tái)電腦就在同一個(gè)局域網(wǎng)內(nèi),就可以完美解決這個(gè)問題,現(xiàn)在把搭建方法和遇到的問題做個(gè)總結(jié),感興趣的朋友一起看看吧
    2023-11-11
  • Python和c++代碼實(shí)現(xiàn)高性能異構(gòu)分布式并行互聯(lián)系統(tǒng)

    Python和c++代碼實(shí)現(xiàn)高性能異構(gòu)分布式并行互聯(lián)系統(tǒng)

    這篇文章主要介紹了Python和c++代碼實(shí)現(xiàn)高性能異構(gòu)分布式并行互聯(lián)系統(tǒng),包含通信模塊、任務(wù)調(diào)度模塊、數(shù)據(jù)管理模塊、負(fù)載均衡模塊、故障容錯(cuò)模塊、性能優(yōu)化模塊、日志與監(jiān)控模塊,需要的朋友可以參考下
    2024-08-08
  • ubuntu服務(wù)器部署過程

    ubuntu服務(wù)器部署過程

    本文詳細(xì)介紹了Ubuntu服務(wù)器的部署過程,包括關(guān)閉歡迎消息、修改hostname、配置SSH、防火墻設(shè)置、安裝和配置Web服務(wù)(如Nginx和Apache)、安裝和配置MySQL、以及PHP的安裝和配置,通過這些步驟,讀者可以成功部署一個(gè)基本的Ubuntu服務(wù)器環(huán)境,感興趣的朋友一起看看吧
    2025-02-02

最新評(píng)論

白玉县| 衡阳市| 应用必备| 宁海县| 武义县| 中西区| 汉沽区| 大洼县| 加查县| 逊克县| 泸西县| 阜宁县| 武陟县| 逊克县| 吴堡县| 湟源县| 加查县| 京山县| 明水县| 英山县| 江口县| 岑巩县| 临城县| 阜宁县| 文成县| 安顺市| 靖江市| 和平县| 绥化市| 达孜县| 土默特左旗| 屯留县| 彩票| 盐城市| 湘潭市| 沿河| 昌平区| 会同县| 高邮市| 望都县| 慈溪市|