欧美18videosex性欧美tube1080,男人的天堂国产亚洲,美女极度色诱视频国产,欧美bbbbbbsbbbbbb,欧美不卡一区二区三区

學(xué)考網(wǎng)

漳州
切換分站

咨詢熱線 18686076947

您所在位置: 學(xué)考網(wǎng) > 教育資訊> 漳州IT認(rèn)證> 漳州web前端> HTTPWeb服務(wù)器---HTTP整體設(shè)計(jì)框架

HTTPWeb服務(wù)器---HTTP整體設(shè)計(jì)框架

發(fā)布時(shí)間:2022-12-08

整個(gè)項(xiàng)目采用B/S模式(瀏覽器-服務(wù)器模式),通過瀏覽器發(fā)送的method(只要包含GET和POST兩種方法),server對(duì)此進(jìn)

行響應(yīng),最終通過html顯示所得到的結(jié)果。

因?yàn)榉?wù)器同時(shí)處理多條連接,因此采用了多線程的結(jié)構(gòu)。


HTTP是在TCP之上,它負(fù)責(zé)在發(fā)送端“生成針對(duì)目標(biāo)Web服務(wù)器的HTTP請(qǐng)求報(bào)文”和在接收端“對(duì)對(duì)Web服務(wù)器請(qǐng)求的內(nèi)容

進(jìn)行處理”,傳輸功能是由TCP完成的,因此首先我們要?jiǎng)?chuàng)建建監(jiān)聽tcp socket


1.服務(wù)器初始化

這里創(chuàng)建tcp sock過程與其他socket編程一致,分別為:socket–>bind–>listen。即創(chuàng)建tcp socket–>綁定端口號(hào)–>監(jiān)聽

socket

在綁定端口號(hào)時(shí),我們采用sockaddr_in的方式,另外為了實(shí)現(xiàn)端口的復(fù)用,采用了setsockopt中SO_REUSRADDR方式。


2.進(jìn)行accept及多線程的建立

我們進(jìn)行accept接收客戶端的connect請(qǐng)求。


accept成功以后,我們使用pthread_create來進(jìn)行創(chuàng)建線程,把socket托付給線程來進(jìn)行操作。在線程處理的過程中,有一個(gè)

問題就是線程等待,我們?yōu)榱私鉀Q這個(gè)問題,我們使用線程分離,這樣使得線程可以作為孤兒進(jìn)程的形式托管給1號(hào)進(jìn)程,當(dāng)執(zhí)

行完畢以后,由1號(hào)進(jìn)程來進(jìn)行資源的回收。

每次收到一個(gè)請(qǐng)求都創(chuàng)建一個(gè)線程,之所以處理線程是讓線程去處理請(qǐng)求,其中讓一個(gè)線程處理請(qǐng)求,另一個(gè)線程可以去調(diào)

accept處理下一個(gè)請(qǐng)求,兩者互不耽誤。

另外,不使用多進(jìn)程是因?yàn)閯?chuàng)建進(jìn)程成本高;I/O多路復(fù)用也可以。


3.線程處理

在整個(gè)線程處理函數(shù)中,我們對(duì)HTTP的請(qǐng)求進(jìn)行分析。


a)獲取HTTP信息

線程處理函數(shù)中最主要的工作就是進(jìn)行HTTP請(qǐng)求的分析,獲取HTTP信息,因?yàn)镠TTP是一種行文本格式協(xié)議,因此我們采取

的方式是按行讀取。

例如:在讀取首行時(shí),我們?yōu)榱双@取首行中有效信息–metnod和url.

就可以把HTTP請(qǐng)求的方法(GET或POST,目前只進(jìn)行處理這兩個(gè)),資源路徑(url)和最后一個(gè)字段–HTTP 的版本信息均獲得

在得到這些資源之后,我們現(xiàn)在要進(jìn)行處理, 接下來就是考慮參數(shù)。HTTP請(qǐng)求經(jīng)常會(huì)帶一些參數(shù),通過這些參數(shù)瀏覽器請(qǐng)求資

源。其中GET方法的資源是在url當(dāng)中,POST方法的資源是在消息正文當(dāng)中,這樣我們也就能得到資源了。

參數(shù)形式舉例:

?a=1&b=2 (均以‘?’開頭,’?’后面是一對(duì)對(duì)用‘&’符號(hào)分割的鍵值對(duì))

需要說明的是,我們項(xiàng)目的多線程HTTP服務(wù)器有三種情況:


非CGI:此時(shí)不帶參數(shù),返回主頁給瀏覽器

GET CGI:此時(shí)參數(shù)在url后,并且按照一定的規(guī)律連接,我們需要把參數(shù)提出來交給CGI程序去進(jìn)行運(yùn)算

POST CGI:此時(shí)參數(shù)在消息正文當(dāng)中,我們需要結(jié)合消息報(bào)頭,提取參數(shù)

b)非CGI模式

我們這里先來看下非cgi方式,這種情況下,首先明白此時(shí)我們可以得到資源路徑,這個(gè)資源路徑其實(shí)就是根目錄下的路徑,

默認(rèn)我們?nèi)ふ腋夸浵碌闹黜摗?/span>

所以我們需要給資源加上index.html

然后我們把整個(gè)index.html的信息發(fā)送給scoket。


c)GET CGI模式

對(duì)于GET CGI模式,最重要的就是解析出url中的url_path和query_string。

如果是method==GET,并且沒有query_string,就認(rèn)為是靜態(tài)頁面

如果是method==GET,且有query_string,就可以根據(jù)query_string參數(shù)內(nèi)容動(dòng)態(tài)計(jì)算生成頁面

d)POST CGI模式

對(duì)于POST CGI模式,此時(shí)參數(shù)在消息正文當(dāng)中,我們需要結(jié)合消息報(bào)頭,提取參數(shù),那么就簡單了,我們只用提取出消息報(bào)頭

中的content_length,(此處為了簡單,只保留了content_length,其他的header內(nèi)容直接就丟棄了), 然后獲取到這個(gè)長度

以后,我們就可以知道向socket讀取多少長度的內(nèi)容了,然后讀取完以后我們就可以獲得到參數(shù),同樣是按照“?”和“&”的

形式進(jìn)行組織的,我們?nèi)〕鲞@個(gè)內(nèi)容,然后進(jìn)行數(shù)據(jù)運(yùn)算操作。


注意

在每次對(duì)于錯(cuò)誤的處理時(shí),我們都將統(tǒng)一返回404,還要注意的是此處只考慮短連接,而短連接的意思是每次瀏覽器給服務(wù)器端

發(fā)送請(qǐng)求之前,都是新建立一個(gè)socket進(jìn)行連接,如果響應(yīng)寫完了,就可以關(guān)閉new_sock。但因?yàn)榇颂幨欠?wù)器主動(dòng)斷開連

接,也就會(huì)進(jìn)入TIME_WAIT狀態(tài),由于服務(wù)器可能短時(shí)間處理大量的連接,就會(huì)導(dǎo)致服務(wù)器上出現(xiàn)大量的TIME_WAIT.因此就

設(shè)置setsockopt REUSERADDR來進(jìn)行端口復(fù)用操作


免費(fèi)試學(xué)

課程好不好,試了才知道!

同意《隱私政策》,并允許推薦給更多服務(wù)商為您提供服務(wù)!